home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the 3D Game Programming Gurus / gurus.iso / DirectX / dx9sdkcp.exe / SDK (C++) / Include / ks.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-11-13  |  145.3 KB  |  5,699 lines

  1. /*++
  2.  
  3. Copyright (c) Microsoft Corporation. All rights reserved.
  4.  
  5. Module Name:
  6.  
  7.     ks.h
  8.  
  9. Abstract:
  10.  
  11.     Windows Driver Model/Connection and Streaming Architecture (WDM-CSA)
  12.     core definitions.
  13.  
  14. --*/
  15.  
  16. #if !defined(_KS_)
  17. #define _KS_
  18.  
  19. #if defined(__TCS__)
  20. #define _KS_NO_ANONYMOUS_STRUCTURES_ 1
  21. #endif
  22.  
  23. #if !defined(_NTRTL_)
  24.     #ifndef DEFINE_GUIDEX
  25.         #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
  26.     #endif // !defined(DEFINE_GUIDEX)
  27.  
  28.     #ifndef STATICGUIDOF
  29.         #define STATICGUIDOF(guid) STATIC_##guid
  30.     #endif // !defined(STATICGUIDOF)
  31. #endif // !defined(_NTRTL_)
  32.  
  33. #ifndef SIZEOF_ARRAY
  34.     #define SIZEOF_ARRAY(ar)        (sizeof(ar)/sizeof((ar)[0]))
  35. #endif // !defined(SIZEOF_ARRAY)
  36.  
  37. #if defined(__cplusplus) && _MSC_VER >= 1100
  38. #define DEFINE_GUIDSTRUCT(g, n) struct __declspec(uuid(g)) n
  39. #define DEFINE_GUIDNAMED(n) __uuidof(struct n)
  40. #else // !defined(__cplusplus)
  41. #define DEFINE_GUIDSTRUCT(g, n) DEFINE_GUIDEX(n)
  42. #define DEFINE_GUIDNAMED(n) n
  43. #endif // !defined(__cplusplus)
  44.  
  45. //===========================================================================
  46.  
  47. #define STATIC_GUID_NULL \
  48.     0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  49.  
  50. DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
  51. #define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
  52.  
  53. //===========================================================================
  54.  
  55. #define IOCTL_KS_PROPERTY              CTL_CODE(FILE_DEVICE_KS, 0x000, METHOD_NEITHER, FILE_ANY_ACCESS)
  56. #define IOCTL_KS_ENABLE_EVENT          CTL_CODE(FILE_DEVICE_KS, 0x001, METHOD_NEITHER, FILE_ANY_ACCESS)
  57. #define IOCTL_KS_DISABLE_EVENT         CTL_CODE(FILE_DEVICE_KS, 0x002, METHOD_NEITHER, FILE_ANY_ACCESS)
  58. #define IOCTL_KS_METHOD                CTL_CODE(FILE_DEVICE_KS, 0x003, METHOD_NEITHER, FILE_ANY_ACCESS)
  59. #define IOCTL_KS_WRITE_STREAM          CTL_CODE(FILE_DEVICE_KS, 0x004, METHOD_NEITHER, FILE_WRITE_ACCESS)
  60. #define IOCTL_KS_READ_STREAM           CTL_CODE(FILE_DEVICE_KS, 0x005, METHOD_NEITHER, FILE_READ_ACCESS)
  61. #define IOCTL_KS_RESET_STATE           CTL_CODE(FILE_DEVICE_KS, 0x006, METHOD_NEITHER, FILE_ANY_ACCESS)
  62.  
  63. //===========================================================================
  64.  
  65. typedef enum {
  66.     KSRESET_BEGIN,
  67.     KSRESET_END
  68. } KSRESET;
  69.  
  70. typedef enum {
  71.     KSSTATE_STOP,
  72.     KSSTATE_ACQUIRE,
  73.     KSSTATE_PAUSE,
  74.     KSSTATE_RUN
  75. } KSSTATE, *PKSSTATE;
  76.  
  77. #define KSPRIORITY_LOW        0x00000001
  78. #define KSPRIORITY_NORMAL     0x40000000
  79. #define KSPRIORITY_HIGH       0x80000000
  80. #define KSPRIORITY_EXCLUSIVE  0xFFFFFFFF
  81.  
  82. typedef struct {
  83.     ULONG   PriorityClass;
  84.     ULONG   PrioritySubClass;
  85. } KSPRIORITY, *PKSPRIORITY;
  86.  
  87. typedef struct {
  88.     union {
  89. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  90.         struct _IDENTIFIER {
  91. #else        
  92.         struct {
  93. #endif        
  94.             GUID    Set;
  95.             ULONG   Id;
  96.             ULONG   Flags;
  97.         };
  98.         LONGLONG    Alignment;
  99.     };
  100. } KSIDENTIFIER, *PKSIDENTIFIER;
  101.  
  102. typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT;
  103.  
  104. #define KSMETHOD_TYPE_NONE                  0x00000000
  105. #define KSMETHOD_TYPE_READ                  0x00000001
  106. #define KSMETHOD_TYPE_WRITE                 0x00000002
  107. #define KSMETHOD_TYPE_MODIFY                0x00000003
  108. #define KSMETHOD_TYPE_SOURCE                0x00000004
  109.  
  110. #define KSMETHOD_TYPE_SEND                  0x00000001
  111. #define KSMETHOD_TYPE_SETSUPPORT            0x00000100
  112. #define KSMETHOD_TYPE_BASICSUPPORT          0x00000200
  113.  
  114. #define KSMETHOD_TYPE_TOPOLOGY 0x10000000
  115.  
  116. #define KSPROPERTY_TYPE_GET                 0x00000001
  117. #define KSPROPERTY_TYPE_SET                 0x00000002
  118. #define KSPROPERTY_TYPE_SETSUPPORT          0x00000100
  119. #define KSPROPERTY_TYPE_BASICSUPPORT        0x00000200
  120. #define KSPROPERTY_TYPE_RELATIONS           0x00000400
  121. #define KSPROPERTY_TYPE_SERIALIZESET        0x00000800
  122. #define KSPROPERTY_TYPE_UNSERIALIZESET      0x00001000
  123. #define KSPROPERTY_TYPE_SERIALIZERAW        0x00002000
  124. #define KSPROPERTY_TYPE_UNSERIALIZERAW      0x00004000
  125. #define KSPROPERTY_TYPE_SERIALIZESIZE       0x00008000
  126. #define KSPROPERTY_TYPE_DEFAULTVALUES       0x00010000
  127.  
  128. #define KSPROPERTY_TYPE_TOPOLOGY 0x10000000
  129.  
  130. typedef struct {
  131.     KSPROPERTY      Property;
  132.     ULONG           NodeId;
  133.     ULONG           Reserved;
  134. } KSP_NODE, *PKSP_NODE;
  135.  
  136. typedef struct {
  137.     KSMETHOD        Method;
  138.     ULONG           NodeId;
  139.     ULONG           Reserved;
  140. } KSM_NODE, *PKSM_NODE;
  141.  
  142. typedef struct {
  143.     KSEVENT         Event;
  144.     ULONG           NodeId;
  145.     ULONG           Reserved;
  146. } KSE_NODE, *PKSE_NODE;
  147.  
  148. #define STATIC_KSPROPTYPESETID_General \
  149.     0x97E99BA0L, 0xBDEA, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  150. DEFINE_GUIDSTRUCT("97E99BA0-BDEA-11CF-A5D6-28DB04C10000", KSPROPTYPESETID_General);
  151. #define KSPROPTYPESETID_General DEFINE_GUIDNAMED(KSPROPTYPESETID_General)
  152.  
  153. #if defined(_NTDDK_) && !defined(__wtypes_h__)
  154. enum VARENUM {
  155.     VT_EMPTY = 0,
  156.     VT_NULL = 1,
  157.     VT_I2 = 2,
  158.     VT_I4 = 3,
  159.     VT_R4 = 4,
  160.     VT_R8 = 5,
  161.     VT_CY = 6,
  162.     VT_DATE = 7,
  163.     VT_BSTR = 8,
  164.     VT_DISPATCH = 9,
  165.     VT_ERROR = 10,
  166.     VT_BOOL = 11,
  167.     VT_VARIANT = 12,
  168.     VT_UNKNOWN = 13,
  169.     VT_DECIMAL = 14,
  170.     VT_I1 = 16,
  171.     VT_UI1 = 17,
  172.     VT_UI2 = 18,
  173.     VT_UI4 = 19,
  174.     VT_I8 = 20,
  175.     VT_UI8 = 21,
  176.     VT_INT = 22,
  177.     VT_UINT = 23,
  178.     VT_VOID = 24,
  179.     VT_HRESULT  = 25,
  180.     VT_PTR = 26,
  181.     VT_SAFEARRAY = 27,
  182.     VT_CARRAY = 28,
  183.     VT_USERDEFINED = 29,
  184.     VT_LPSTR = 30,
  185.     VT_LPWSTR = 31,
  186.     VT_FILETIME = 64,
  187.     VT_BLOB = 65,
  188.     VT_STREAM = 66,
  189.     VT_STORAGE = 67,
  190.     VT_STREAMED_OBJECT = 68,
  191.     VT_STORED_OBJECT = 69,
  192.     VT_BLOB_OBJECT = 70,
  193.     VT_CF = 71,
  194.     VT_CLSID = 72,
  195.     VT_VECTOR = 0x1000,
  196.     VT_ARRAY = 0x2000,
  197.     VT_BYREF = 0x4000,
  198.     VT_RESERVED = 0x8000,
  199.     VT_ILLEGAL = 0xffff,
  200.     VT_ILLEGALMASKED = 0xfff,
  201.     VT_TYPEMASK = 0xfff
  202. };
  203. #endif // _NTDDK_ && !__wtypes_h__
  204.  
  205. typedef struct {
  206.     ULONG    Size;
  207.     ULONG    Count;
  208. } KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM;
  209.  
  210. typedef struct {
  211.     ULONG           AccessFlags;
  212.     ULONG           DescriptionSize;
  213.     KSIDENTIFIER    PropTypeSet;
  214.     ULONG           MembersListCount;
  215.     ULONG           Reserved;
  216. } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION;
  217.  
  218. #define KSPROPERTY_MEMBER_RANGES            0x00000001
  219. #define KSPROPERTY_MEMBER_STEPPEDRANGES     0x00000002
  220. #define KSPROPERTY_MEMBER_VALUES            0x00000003
  221.  
  222. #define KSPROPERTY_MEMBER_FLAG_DEFAULT                      0x00000001
  223. #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL    0x00000002
  224. #define KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM         0x00000004
  225.  
  226. typedef struct {
  227.     ULONG   MembersFlags;
  228.     ULONG   MembersSize;
  229.     ULONG   MembersCount;
  230.     ULONG   Flags;
  231. } KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER;
  232.  
  233. typedef union {
  234. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  235.     struct _SIGNED {
  236. #else
  237.     struct {
  238. #endif    
  239.         LONG    SignedMinimum;
  240.         LONG    SignedMaximum;
  241.     };
  242. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  243.     struct _UNSIGNED {
  244. #else
  245.     struct {
  246. #endif    
  247.         ULONG   UnsignedMinimum;
  248.         ULONG   UnsignedMaximum;
  249.     };
  250. } KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG;
  251.  
  252. typedef union {
  253. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  254.     struct _SIGNED64 {
  255. #else
  256.     struct {
  257. #endif    
  258.         LONGLONG    SignedMinimum;
  259.         LONGLONG    SignedMaximum;
  260.     };
  261. #if defined( _KS_NO_ANONYMOUS_STRUCTURES_ )
  262.     struct _UNSIGNED64 {
  263. #else
  264.     struct {
  265. #endif    
  266. #if defined(_NTDDK_)
  267.         ULONGLONG   UnsignedMinimum;
  268.         ULONGLONG   UnsignedMaximum;
  269. #else // !_NTDDK_
  270.         DWORDLONG   UnsignedMinimum;
  271.         DWORDLONG   UnsignedMaximum;
  272. #endif // !_NTDDK_
  273.     };
  274. } KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG;
  275.  
  276. typedef struct {
  277.     ULONG                       SteppingDelta;
  278.     ULONG                       Reserved;
  279.     KSPROPERTY_BOUNDS_LONG      Bounds;
  280. } KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG;
  281.  
  282. typedef struct {
  283. #if defined(_NTDDK_)
  284.     ULONGLONG                   SteppingDelta;
  285. #else // !_NTDDK_
  286.     DWORDLONG                   SteppingDelta;
  287. #endif // !_NTDDK_
  288.     KSPROPERTY_BOUNDS_LONGLONG  Bounds;
  289. } KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG;
  290.  
  291. //===========================================================================
  292.  
  293. #if defined(_NTDDK_)
  294. //
  295. // Structure forward declarations.
  296. //
  297. typedef struct _KSDEVICE_DESCRIPTOR
  298. KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
  299. typedef struct _KSDEVICE_DISPATCH
  300. KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
  301. typedef struct _KSDEVICE 
  302. KSDEVICE, *PKSDEVICE;
  303. typedef struct _KSFILTERFACTORY 
  304. KSFILTERFACTORY, *PKSFILTERFACTORY;
  305. typedef struct _KSFILTER_DESCRIPTOR
  306. KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
  307. typedef struct _KSFILTER_DISPATCH
  308. KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
  309. typedef struct _KSFILTER 
  310. KSFILTER, *PKSFILTER;
  311. typedef struct _KSPIN_DESCRIPTOR_EX
  312. KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
  313. typedef struct _KSPIN_DISPATCH
  314. KSPIN_DISPATCH, *PKSPIN_DISPATCH;
  315. typedef struct _KSCLOCK_DISPATCH
  316. KSCLOCK_DISPATCH, *PKSCLOCK_DISPATCH;
  317. typedef struct _KSALLOCATOR_DISPATCH
  318. KSALLOCATOR_DISPATCH, *PKSALLOCATOR_DISPATCH;
  319. typedef struct _KSPIN 
  320. KSPIN, *PKSPIN;
  321. typedef struct _KSNODE_DESCRIPTOR
  322. KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
  323. typedef struct _KSSTREAM_POINTER_OFFSET
  324. KSSTREAM_POINTER_OFFSET, *PKSSTREAM_POINTER_OFFSET;
  325. typedef struct _KSSTREAM_POINTER
  326. KSSTREAM_POINTER, *PKSSTREAM_POINTER;
  327. typedef struct _KSMAPPING
  328. KSMAPPING, *PKSMAPPING;
  329. typedef struct _KSPROCESSPIN
  330. KSPROCESSPIN, *PKSPROCESSPIN;
  331. typedef struct _KSPROCESSPIN_INDEXENTRY
  332. KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
  333. #endif // _NTDDK_
  334.  
  335. typedef PVOID PKSWORKER;
  336.  
  337. typedef struct {
  338.     ULONG       NotificationType;
  339.     union {
  340.         struct {
  341.             HANDLE              Event;
  342.             ULONG_PTR           Reserved[2];
  343.         } EventHandle;
  344.         struct {
  345.             HANDLE              Semaphore;
  346.             ULONG               Reserved;
  347.             LONG                Adjustment;
  348.         } SemaphoreHandle;
  349. #if defined(_NTDDK_)
  350.         struct {
  351.             PVOID               Event;
  352.             KPRIORITY           Increment;
  353.             ULONG_PTR           Reserved;
  354.         } EventObject;
  355.         struct {
  356.             PVOID               Semaphore;
  357.             KPRIORITY           Increment;
  358.             LONG                Adjustment;
  359.         } SemaphoreObject;
  360.         struct {
  361.             PKDPC               Dpc;
  362.             ULONG               ReferenceCount;
  363.             ULONG_PTR           Reserved;
  364.         } Dpc;
  365.         struct {
  366.             PWORK_QUEUE_ITEM    WorkQueueItem;
  367.             WORK_QUEUE_TYPE     WorkQueueType;
  368.             ULONG_PTR           Reserved;
  369.         } WorkItem;
  370.         struct {
  371.             PWORK_QUEUE_ITEM    WorkQueueItem;
  372.             PKSWORKER           KsWorkerObject;
  373.             ULONG_PTR           Reserved;
  374.         } KsWorkItem;
  375. // @@BEGIN_DDKSPLIT
  376.         struct {
  377.             PKSFILTER           Filter;
  378.             ULONG_PTR           Reserved[2];
  379.         } KsFilterProcessing;
  380.         struct {
  381.             PKSPIN              Pin;
  382.             ULONG_PTR           Reserved[2];
  383.         } KsPinProcessing;
  384. // @@END_DDKSPLIT
  385. #endif // defined(_NTDDK_)
  386.         struct {
  387.             PVOID               Unused;
  388.             LONG_PTR            Alignment[2];
  389.         } Alignment;
  390.     };
  391. } KSEVENTDATA, *PKSEVENTDATA;
  392.  
  393. #define KSEVENTF_EVENT_HANDLE       0x00000001
  394. #define KSEVENTF_SEMAPHORE_HANDLE   0x00000002
  395. #if defined(_NTDDK_)
  396. #define KSEVENTF_EVENT_OBJECT       0x00000004
  397. #define KSEVENTF_SEMAPHORE_OBJECT   0x00000008
  398. #define KSEVENTF_DPC                0x00000010
  399. #define KSEVENTF_WORKITEM           0x00000020
  400. #define KSEVENTF_KSWORKITEM         0x00000080
  401. // @@BEGIN_DDKSPLIT
  402. #define KSEVENTF_KSFILTERPROCESSING 0x00000100
  403. #define KSEVENTF_KSPINPROCESSING    0x00000200
  404. // @@END_DDKSPLIT
  405. #endif // defined(_NTDDK_)
  406.  
  407. #define KSEVENT_TYPE_ENABLE         0x00000001
  408. #define KSEVENT_TYPE_ONESHOT        0x00000002
  409. #define KSEVENT_TYPE_ENABLEBUFFERED 0x00000004
  410. #define KSEVENT_TYPE_SETSUPPORT     0x00000100
  411. #define KSEVENT_TYPE_BASICSUPPORT   0x00000200
  412. #define KSEVENT_TYPE_QUERYBUFFER    0x00000400
  413.  
  414. #define KSEVENT_TYPE_TOPOLOGY 0x10000000
  415.  
  416. typedef struct {
  417.     KSEVENT         Event;
  418.     PKSEVENTDATA    EventData;
  419.     PVOID           Reserved;
  420. } KSQUERYBUFFER, *PKSQUERYBUFFER;
  421.  
  422. typedef struct {
  423.     ULONG Size;
  424.     ULONG Flags;
  425.     union {
  426.         HANDLE ObjectHandle;
  427.         PVOID ObjectPointer;
  428.     };
  429.     PVOID Reserved;
  430.     KSEVENT Event;
  431.     KSEVENTDATA EventData;
  432. } KSRELATIVEEVENT;
  433.  
  434. #define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001
  435. #define KSRELATIVEEVENT_FLAG_POINTER 0x00000002
  436.  
  437. //===========================================================================
  438.  
  439. typedef struct {
  440.     KSEVENTDATA     EventData;
  441.     LONGLONG        MarkTime;
  442. } KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK;
  443.  
  444. typedef struct {
  445.     KSEVENTDATA     EventData;
  446.     LONGLONG        TimeBase;
  447.     LONGLONG        Interval;
  448. } KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL;
  449.  
  450. typedef struct {
  451.     LONGLONG        TimeBase;
  452.     LONGLONG        Interval;
  453. } KSINTERVAL, *PKSINTERVAL;
  454.  
  455. //===========================================================================
  456.  
  457. #define STATIC_KSPROPSETID_General\
  458.     0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  459. DEFINE_GUIDSTRUCT("1464EDA5-6A8F-11D1-9AA7-00A0C9223196", KSPROPSETID_General);
  460. #define KSPROPSETID_General DEFINE_GUIDNAMED(KSPROPSETID_General)
  461.  
  462. typedef enum {
  463.     KSPROPERTY_GENERAL_COMPONENTID
  464. } KSPROPERTY_GENERAL;
  465.  
  466. typedef struct {
  467.     GUID    Manufacturer;
  468.     GUID    Product;
  469.     GUID    Component;
  470.     GUID    Name;
  471.     ULONG   Version;
  472.     ULONG   Revision;
  473. } KSCOMPONENTID, *PKSCOMPONENTID;
  474.  
  475. #define DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(Handler)\
  476.     DEFINE_KSPROPERTY_ITEM(\
  477.         KSPROPERTY_GENERAL_COMPONENTID,\
  478.         (Handler),\
  479.         sizeof(KSPROPERTY),\
  480.         sizeof(KSCOMPONENTID),\
  481.         NULL, NULL, 0, NULL, NULL, 0)
  482.  
  483. #define STATIC_KSMETHODSETID_StreamIo\
  484.     0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  485. DEFINE_GUIDSTRUCT("65D003CA-1523-11D2-B27A-00A0C9223196", KSMETHODSETID_StreamIo);
  486. #define KSMETHODSETID_StreamIo DEFINE_GUIDNAMED(KSMETHODSETID_StreamIo)
  487.  
  488. typedef enum {
  489.     KSMETHOD_STREAMIO_READ,
  490.     KSMETHOD_STREAMIO_WRITE
  491. } KSMETHOD_STREAMIO;
  492.  
  493. #define DEFINE_KSMETHOD_ITEM_STREAMIO_READ(Handler)\
  494.     DEFINE_KSMETHOD_ITEM(\
  495.         KSMETHOD_STREAMIO_READ,\
  496.         KSMETHOD_TYPE_WRITE,\
  497.         (Handler),\
  498.         sizeof(KSMETHOD),\
  499.         0,\
  500.         NULL)
  501.  
  502. #define DEFINE_KSMETHOD_ITEM_STREAMIO_WRITE(Handler)\
  503.     DEFINE_KSMETHOD_ITEM(\
  504.         KSMETHOD_STREAMIO_WRITE,\
  505.         KSMETHOD_TYPE_READ,\
  506.         (Handler),\
  507.         sizeof(KSMETHOD),\
  508.         0,\
  509.         NULL)
  510.  
  511. #define STATIC_KSPROPSETID_MediaSeeking\
  512.     0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  513. DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
  514. #define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
  515.  
  516. typedef enum {
  517.     KSPROPERTY_MEDIASEEKING_CAPABILITIES,
  518.     KSPROPERTY_MEDIASEEKING_FORMATS,
  519.     KSPROPERTY_MEDIASEEKING_TIMEFORMAT,
  520.     KSPROPERTY_MEDIASEEKING_POSITION,
  521.     KSPROPERTY_MEDIASEEKING_STOPPOSITION,
  522.     KSPROPERTY_MEDIASEEKING_POSITIONS,
  523.     KSPROPERTY_MEDIASEEKING_DURATION,
  524.     KSPROPERTY_MEDIASEEKING_AVAILABLE,
  525.     KSPROPERTY_MEDIASEEKING_PREROLL,
  526.     KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT
  527. } KSPROPERTY_MEDIASEEKING;
  528.  
  529. typedef enum {
  530.     KS_SEEKING_NoPositioning,
  531.     KS_SEEKING_AbsolutePositioning,
  532.     KS_SEEKING_RelativePositioning,
  533.     KS_SEEKING_IncrementalPositioning,
  534.     KS_SEEKING_PositioningBitsMask = 0x3,
  535.     KS_SEEKING_SeekToKeyFrame,
  536.     KS_SEEKING_ReturnTime = 0x8
  537. } KS_SEEKING_FLAGS;
  538.  
  539. typedef enum {
  540.     KS_SEEKING_CanSeekAbsolute = 0x1,
  541.     KS_SEEKING_CanSeekForwards = 0x2,
  542.     KS_SEEKING_CanSeekBackwards = 0x4,
  543.     KS_SEEKING_CanGetCurrentPos = 0x8,
  544.     KS_SEEKING_CanGetStopPos = 0x10,
  545.     KS_SEEKING_CanGetDuration = 0x20,
  546.     KS_SEEKING_CanPlayBackwards = 0x40
  547. } KS_SEEKING_CAPABILITIES;
  548.  
  549. typedef struct {
  550.     LONGLONG            Current;
  551.     LONGLONG            Stop;
  552.     KS_SEEKING_FLAGS    CurrentFlags;
  553.     KS_SEEKING_FLAGS    StopFlags;
  554. } KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS;
  555.  
  556. typedef struct {
  557.     LONGLONG    Earliest;
  558.     LONGLONG    Latest;
  559. } KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE;
  560.  
  561. typedef struct {
  562.     KSPROPERTY  Property;
  563.     GUID        SourceFormat;
  564.     GUID        TargetFormat;
  565.     LONGLONG    Time;
  566. } KSP_TIMEFORMAT, *PKSP_TIMEFORMAT;
  567.  
  568. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\
  569.     DEFINE_KSPROPERTY_ITEM(\
  570.         KSPROPERTY_MEDIASEEKING_CAPABILITIES,\
  571.         (Handler),\
  572.         sizeof(KSPROPERTY),\
  573.         sizeof(KS_SEEKING_CAPABILITIES),\
  574.         NULL, NULL, 0, NULL, NULL, 0)
  575.  
  576. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\
  577.     DEFINE_KSPROPERTY_ITEM(\
  578.         KSPROPERTY_MEDIASEEKING_FORMATS,\
  579.         (Handler),\
  580.         sizeof(KSPROPERTY),\
  581.         0,\
  582.         NULL, NULL, 0, NULL, NULL, 0)
  583.  
  584. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\
  585.     DEFINE_KSPROPERTY_ITEM(\
  586.         KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\
  587.         (GetHandler),\
  588.         sizeof(KSPROPERTY),\
  589.         sizeof(GUID),\
  590.         (SetHandler),\
  591.         NULL, 0, NULL, NULL, 0)
  592.  
  593. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\
  594.     DEFINE_KSPROPERTY_ITEM(\
  595.         KSPROPERTY_MEDIASEEKING_POSITION,\
  596.         (Handler),\
  597.         sizeof(KSPROPERTY),\
  598.         sizeof(LONGLONG),\
  599.         NULL, NULL, 0, NULL, NULL, 0)
  600.  
  601. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\
  602.     DEFINE_KSPROPERTY_ITEM(\
  603.         KSPROPERTY_MEDIASEEKING_STOPPOSITION,\
  604.         (Handler),\
  605.         sizeof(KSPROPERTY),\
  606.         sizeof(LONGLONG),\
  607.         NULL, NULL, 0, NULL, NULL, 0)
  608.  
  609. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\
  610.     DEFINE_KSPROPERTY_ITEM(\
  611.         KSPROPERTY_MEDIASEEKING_POSITIONS,\
  612.         NULL,\
  613.         sizeof(KSPROPERTY),\
  614.         sizeof(KSPROPERTY_POSITIONS),\
  615.         (Handler),\
  616.         NULL, 0, NULL, NULL, 0)
  617.  
  618. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\
  619.     DEFINE_KSPROPERTY_ITEM(\
  620.         KSPROPERTY_MEDIASEEKING_DURATION,\
  621.         (Handler),\
  622.         sizeof(KSPROPERTY),\
  623.         sizeof(LONGLONG),\
  624.         NULL, NULL, 0, NULL, NULL, 0)
  625.  
  626. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\
  627.     DEFINE_KSPROPERTY_ITEM(\
  628.         KSPROPERTY_MEDIASEEKING_AVAILABLE,\
  629.         (Handler),\
  630.         sizeof(KSPROPERTY),\
  631.         sizeof(KSPROPERTY_MEDIAAVAILABLE),\
  632.         NULL, NULL, 0, NULL, NULL, 0)
  633.  
  634. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\
  635.     DEFINE_KSPROPERTY_ITEM(\
  636.         KSPROPERTY_MEDIASEEKING_PREROLL,\
  637.         (Handler),\
  638.         sizeof(KSPROPERTY),\
  639.         sizeof(LONGLONG),\
  640.         NULL, NULL, 0, NULL, NULL, 0)
  641.  
  642. #define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\
  643.     DEFINE_KSPROPERTY_ITEM(\
  644.         KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\
  645.         (Handler),\
  646.         sizeof(KSP_TIMEFORMAT),\
  647.         sizeof(LONGLONG),\
  648.         NULL, NULL, 0, NULL, NULL, 0)
  649.  
  650. //===========================================================================
  651.  
  652. #define STATIC_KSPROPSETID_Topology\
  653.     0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  654. DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
  655. #define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
  656.  
  657. typedef enum {
  658.     KSPROPERTY_TOPOLOGY_CATEGORIES,
  659.     KSPROPERTY_TOPOLOGY_NODES,
  660.     KSPROPERTY_TOPOLOGY_CONNECTIONS,
  661.     KSPROPERTY_TOPOLOGY_NAME
  662. } KSPROPERTY_TOPOLOGY;
  663.  
  664. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler)\
  665.     DEFINE_KSPROPERTY_ITEM(\
  666.         KSPROPERTY_TOPOLOGY_CATEGORIES,\
  667.         (Handler),\
  668.         sizeof(KSPROPERTY),\
  669.         0,\
  670.         NULL, NULL, 0, NULL, NULL, 0)
  671.  
  672. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler)\
  673.     DEFINE_KSPROPERTY_ITEM(\
  674.         KSPROPERTY_TOPOLOGY_NODES,\
  675.         (Handler),\
  676.         sizeof(KSPROPERTY),\
  677.         0,\
  678.         NULL, NULL, 0, NULL, NULL, 0)
  679.  
  680. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler)\
  681.     DEFINE_KSPROPERTY_ITEM(\
  682.         KSPROPERTY_TOPOLOGY_CONNECTIONS,\
  683.         (Handler),\
  684.         sizeof(KSPROPERTY),\
  685.         0,\
  686.         NULL, NULL, 0, NULL, NULL, 0)
  687.  
  688. #define DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  689.     DEFINE_KSPROPERTY_ITEM(\
  690.         KSPROPERTY_TOPOLOGY_NAME,\
  691.         (Handler),\
  692.         sizeof(KSP_NODE),\
  693.         0,\
  694.         NULL, NULL, 0, NULL, NULL, 0)
  695.  
  696. #define DEFINE_KSPROPERTY_TOPOLOGYSET(TopologySet, Handler)\
  697. DEFINE_KSPROPERTY_TABLE(TopologySet) {\
  698.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CATEGORIES(Handler),\
  699.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NODES(Handler),\
  700.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_CONNECTIONS(Handler),\
  701.     DEFINE_KSPROPERTY_ITEM_TOPOLOGY_NAME(Handler)\
  702. }
  703.  
  704. //=============================================================================
  705.  
  706. //
  707. // properties used by graph manager to talk to particular filters
  708. //
  709. #if defined(_NTDDK_)
  710.  
  711. #define STATIC_KSPROPSETID_GM \
  712.     0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D    
  713. DEFINE_GUIDSTRUCT("AF627536-E719-11D2-8A1D-006097D2DF5D", KSPROPSETID_GM);
  714. #define KSPROPSETID_GM DEFINE_GUIDNAMED(KSPROPSETID_GM)
  715.  
  716. typedef VOID (*PFNKSGRAPHMANAGER_NOTIFY)(IN PFILE_OBJECT GraphManager,
  717.                                          IN ULONG EventId,
  718.                                          IN PVOID Filter,
  719.                                          IN PVOID Pin,
  720.                                          IN PVOID Frame,
  721.                                          IN ULONG Duration);
  722.  
  723. typedef struct KSGRAPHMANAGER_FUNCTIONTABLE {
  724.     PFNKSGRAPHMANAGER_NOTIFY NotifyEvent;
  725. } KSGRAPHMANAGER_FUNCTIONTABLE, PKSGRAPHMANAGER_FUNCTIONTABLE;
  726.  
  727. typedef struct _KSPROPERTY_GRAPHMANAGER_INTERFACE {
  728.     PFILE_OBJECT                 GraphManager;
  729.     KSGRAPHMANAGER_FUNCTIONTABLE FunctionTable;
  730. } KSPROPERTY_GRAPHMANAGER_INTERFACE, *PKSPROPERTY_GRAPHMANAGER_INTERFACE;
  731.  
  732.  
  733. //
  734. // Commands
  735. //
  736. typedef enum {
  737.     KSPROPERTY_GM_GRAPHMANAGER,    
  738.     KSPROPERTY_GM_TIMESTAMP_CLOCK, 
  739.     KSPROPERTY_GM_RATEMATCH,       
  740.     KSPROPERTY_GM_RENDER_CLOCK,    
  741. } KSPROPERTY_GM;
  742.  
  743. #endif
  744.  
  745. //===========================================================================
  746.  
  747.  
  748. #define STATIC_KSCATEGORY_BRIDGE \
  749.     0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  750. DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
  751. #define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
  752.  
  753. #define STATIC_KSCATEGORY_CAPTURE \
  754.     0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  755. DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
  756. #define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
  757.  
  758. #define STATIC_KSCATEGORY_RENDER \
  759.     0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  760. DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
  761. #define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
  762.  
  763. #define STATIC_KSCATEGORY_MIXER \
  764.     0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  765. DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
  766. #define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
  767.  
  768. #define STATIC_KSCATEGORY_SPLITTER \
  769.     0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  770. DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
  771. #define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
  772.  
  773. #define STATIC_KSCATEGORY_DATACOMPRESSOR \
  774.     0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  775. DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
  776. #define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
  777.  
  778. #define STATIC_KSCATEGORY_DATADECOMPRESSOR \
  779.     0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  780. DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
  781. #define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
  782.  
  783. #define STATIC_KSCATEGORY_DATATRANSFORM \
  784.     0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  785. DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
  786. #define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
  787.  
  788. #define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
  789.     0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  790. DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
  791. #define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
  792.  
  793. #define STATIC_KSCATEGORY_INTERFACETRANSFORM \
  794.     0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  795. DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
  796. #define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
  797.  
  798. #define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
  799.     0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  800. DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
  801. #define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
  802.  
  803. #define STATIC_KSCATEGORY_FILESYSTEM \
  804.     0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  805. DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
  806. #define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
  807.  
  808. // KSNAME_Clock
  809. #define STATIC_KSCATEGORY_CLOCK \
  810.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  811. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
  812. #define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
  813.  
  814. #define STATIC_KSCATEGORY_PROXY \
  815.     0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  816. DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
  817. #define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
  818.  
  819. #define STATIC_KSCATEGORY_QUALITY \
  820.     0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  821. DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
  822. #define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
  823.  
  824. typedef struct {
  825.     ULONG   FromNode;
  826.     ULONG   FromNodePin;
  827.     ULONG   ToNode;
  828.     ULONG   ToNodePin;
  829. } KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
  830.  
  831. typedef struct {
  832.     ULONG                           CategoriesCount;
  833.     const GUID*                     Categories;
  834.     ULONG                           TopologyNodesCount;
  835.     const GUID*                     TopologyNodes;
  836.     ULONG                           TopologyConnectionsCount;
  837.     const KSTOPOLOGY_CONNECTION*    TopologyConnections;
  838.     const GUID*                     TopologyNodesNames;
  839.     ULONG                           Reserved;
  840. } KSTOPOLOGY, *PKSTOPOLOGY;
  841.  
  842. #define KSFILTER_NODE   ((ULONG)-1)
  843. #define KSALL_NODES     ((ULONG)-1)
  844.  
  845. typedef struct {
  846.     ULONG       CreateFlags;
  847.     ULONG       Node;
  848. } KSNODE_CREATE, *PKSNODE_CREATE;
  849.  
  850. //===========================================================================
  851.  
  852. // TIME_FORMAT_NONE
  853. #define STATIC_KSTIME_FORMAT_NONE       STATIC_GUID_NULL
  854. #define KSTIME_FORMAT_NONE              GUID_NULL
  855.  
  856. // TIME_FORMAT_FRAME
  857. #define STATIC_KSTIME_FORMAT_FRAME\
  858.     0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  859. DEFINE_GUIDSTRUCT("7b785570-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FRAME);
  860. #define KSTIME_FORMAT_FRAME DEFINE_GUIDNAMED(KSTIME_FORMAT_FRAME)
  861.  
  862. // TIME_FORMAT_BYTE             
  863. #define STATIC_KSTIME_FORMAT_BYTE\
  864.     0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  865. DEFINE_GUIDSTRUCT("7b785571-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_BYTE);
  866. #define KSTIME_FORMAT_BYTE DEFINE_GUIDNAMED(KSTIME_FORMAT_BYTE)
  867.  
  868. // TIME_FORMAT_SAMPLE
  869. #define STATIC_KSTIME_FORMAT_SAMPLE\
  870.     0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  871. DEFINE_GUIDSTRUCT("7b785572-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_SAMPLE);
  872. #define KSTIME_FORMAT_SAMPLE DEFINE_GUIDNAMED(KSTIME_FORMAT_SAMPLE)
  873.  
  874. // TIME_FORMAT_FIELD
  875. #define STATIC_KSTIME_FORMAT_FIELD\
  876.     0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  877. DEFINE_GUIDSTRUCT("7b785573-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_FIELD);
  878. #define KSTIME_FORMAT_FIELD DEFINE_GUIDNAMED(KSTIME_FORMAT_FIELD)
  879.  
  880. // TIME_FORMAT_MEDIA_TIME
  881. #define STATIC_KSTIME_FORMAT_MEDIA_TIME\
  882.     0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6
  883. DEFINE_GUIDSTRUCT("7b785574-8c82-11cf-bc0c-00aa00ac74f6", KSTIME_FORMAT_MEDIA_TIME);
  884. #define KSTIME_FORMAT_MEDIA_TIME DEFINE_GUIDNAMED(KSTIME_FORMAT_MEDIA_TIME)
  885.  
  886. //===========================================================================
  887.  
  888. typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
  889.  
  890. #define STATIC_KSINTERFACESETID_Standard \
  891.     0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  892. DEFINE_GUIDSTRUCT("1A8766A0-62CE-11CF-A5D6-28DB04C10000", KSINTERFACESETID_Standard);
  893. #define KSINTERFACESETID_Standard DEFINE_GUIDNAMED(KSINTERFACESETID_Standard)
  894.  
  895. typedef enum {
  896.     KSINTERFACE_STANDARD_STREAMING,
  897.     KSINTERFACE_STANDARD_LOOPED_STREAMING,
  898.     KSINTERFACE_STANDARD_CONTROL
  899. } KSINTERFACE_STANDARD;
  900.  
  901. #define STATIC_KSINTERFACESETID_FileIo \
  902.     0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  903. DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
  904. #define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
  905.  
  906. typedef enum {
  907.     KSINTERFACE_FILEIO_STREAMING
  908. } KSINTERFACE_FILEIO;
  909.  
  910. //===========================================================================
  911.  
  912. #define KSMEDIUM_TYPE_ANYINSTANCE       0
  913.  
  914. #define STATIC_KSMEDIUMSETID_Standard \
  915.     0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  916. DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard);
  917. #define KSMEDIUMSETID_Standard DEFINE_GUIDNAMED(KSMEDIUMSETID_Standard)
  918.  
  919. //For compatibility only
  920. #define KSMEDIUM_STANDARD_DEVIO     KSMEDIUM_TYPE_ANYINSTANCE
  921.  
  922. //===========================================================================
  923.  
  924. #define STATIC_KSPROPSETID_Pin\
  925.     0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
  926. DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
  927. #define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
  928.  
  929. typedef enum {
  930.     KSPROPERTY_PIN_CINSTANCES,
  931.     KSPROPERTY_PIN_CTYPES,
  932.     KSPROPERTY_PIN_DATAFLOW,
  933.     KSPROPERTY_PIN_DATARANGES,
  934.     KSPROPERTY_PIN_DATAINTERSECTION,
  935.     KSPROPERTY_PIN_INTERFACES,
  936.     KSPROPERTY_PIN_MEDIUMS,
  937.     KSPROPERTY_PIN_COMMUNICATION,
  938.     KSPROPERTY_PIN_GLOBALCINSTANCES,
  939.     KSPROPERTY_PIN_NECESSARYINSTANCES,
  940.     KSPROPERTY_PIN_PHYSICALCONNECTION,
  941.     KSPROPERTY_PIN_CATEGORY,
  942.     KSPROPERTY_PIN_NAME,
  943.     KSPROPERTY_PIN_CONSTRAINEDDATARANGES,
  944.     KSPROPERTY_PIN_PROPOSEDATAFORMAT
  945. } KSPROPERTY_PIN;
  946.  
  947. typedef struct {
  948.     KSPROPERTY      Property;
  949.     ULONG           PinId;
  950.     ULONG           Reserved;
  951. } KSP_PIN, *PKSP_PIN;
  952.  
  953. #define KSINSTANCE_INDETERMINATE    ((ULONG)-1)
  954.  
  955. typedef struct {
  956.     ULONG  PossibleCount;
  957.     ULONG  CurrentCount;
  958. } KSPIN_CINSTANCES, *PKSPIN_CINSTANCES;
  959.  
  960. typedef enum {
  961.     KSPIN_DATAFLOW_IN = 1,
  962.     KSPIN_DATAFLOW_OUT
  963. } KSPIN_DATAFLOW, *PKSPIN_DATAFLOW;
  964.  
  965. #define KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION   0
  966. #define KSDATAFORMAT_TEMPORAL_COMPRESSION       (1 << KSDATAFORMAT_BIT_TEMPORAL_COMPRESSION)
  967. #define KSDATAFORMAT_BIT_ATTRIBUTES 1
  968. #define KSDATAFORMAT_ATTRIBUTES (1 << KSDATAFORMAT_BIT_ATTRIBUTES)
  969.  
  970. #define KSDATARANGE_BIT_ATTRIBUTES 1
  971. #define KSDATARANGE_ATTRIBUTES (1 << KSDATARANGE_BIT_ATTRIBUTES)
  972. #define KSDATARANGE_BIT_REQUIRED_ATTRIBUTES 2
  973. #define KSDATARANGE_REQUIRED_ATTRIBUTES (1 << KSDATARANGE_BIT_REQUIRED_ATTRIBUTES)
  974.  
  975. #if !defined( _MSC_VER ) 
  976. typedef struct {
  977.     ULONG   FormatSize;
  978.     ULONG   Flags;
  979.     ULONG   SampleSize;
  980.     ULONG   Reserved;
  981.     GUID    MajorFormat;
  982.     GUID    SubFormat;
  983.     GUID    Specifier;
  984. } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  985. #else
  986. typedef union {
  987.     struct {
  988.         ULONG   FormatSize;
  989.         ULONG   Flags;
  990.         ULONG   SampleSize;
  991.         ULONG   Reserved;
  992.         GUID    MajorFormat;
  993.         GUID    SubFormat;
  994.         GUID    Specifier;
  995.     };
  996.     LONGLONG    Alignment;
  997. } KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
  998. #endif
  999.  
  1000. #define KSATTRIBUTE_REQUIRED 0x00000001
  1001.  
  1002. typedef struct {
  1003.     ULONG Size;
  1004.     ULONG Flags;
  1005.     GUID Attribute;
  1006. } KSATTRIBUTE, *PKSATTRIBUTE;
  1007.  
  1008. #if defined(_NTDDK_)
  1009. typedef struct {
  1010.     ULONG Count;
  1011.     PKSATTRIBUTE* Attributes;
  1012. } KSATTRIBUTE_LIST, *PKSATTRIBUTE_LIST;
  1013. #endif // _NTDDK_
  1014.  
  1015. typedef enum {
  1016.     KSPIN_COMMUNICATION_NONE,
  1017.     KSPIN_COMMUNICATION_SINK,
  1018.     KSPIN_COMMUNICATION_SOURCE,
  1019.     KSPIN_COMMUNICATION_BOTH,
  1020.     KSPIN_COMMUNICATION_BRIDGE
  1021. } KSPIN_COMMUNICATION, *PKSPIN_COMMUNICATION;
  1022.  
  1023. typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
  1024.  
  1025. typedef struct {
  1026.     KSPIN_INTERFACE Interface;
  1027.     KSPIN_MEDIUM    Medium;
  1028.     ULONG           PinId;
  1029.     HANDLE          PinToHandle;
  1030.     KSPRIORITY      Priority;
  1031. } KSPIN_CONNECT, *PKSPIN_CONNECT;
  1032.  
  1033. typedef struct {
  1034.     ULONG   Size;
  1035.     ULONG   Pin;
  1036.     WCHAR   SymbolicLinkName[1];
  1037. } KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION;
  1038.  
  1039. #if defined(_NTDDK_)
  1040. typedef
  1041. NTSTATUS
  1042. (*PFNKSINTERSECTHANDLER)(
  1043.     IN PIRP Irp,
  1044.     IN PKSP_PIN Pin,
  1045.     IN PKSDATARANGE DataRange,
  1046.     OUT PVOID Data OPTIONAL
  1047.     );
  1048. typedef
  1049. NTSTATUS
  1050. (*PFNKSINTERSECTHANDLEREX)(
  1051.     IN PVOID Context,
  1052.     IN PIRP Irp,
  1053.     IN PKSP_PIN Pin,
  1054.     IN PKSDATARANGE DataRange,
  1055.     IN PKSDATARANGE MatchingDataRange,
  1056.     IN ULONG DataBufferSize,
  1057.     OUT PVOID Data OPTIONAL,
  1058.     OUT PULONG DataSize
  1059.     );
  1060. #endif // _NTDDK_
  1061.  
  1062. #define DEFINE_KSPIN_INTERFACE_TABLE(tablename)\
  1063.     const KSPIN_INTERFACE tablename[] =
  1064.  
  1065. #define DEFINE_KSPIN_INTERFACE_ITEM(guid, interface)\
  1066.     {\
  1067.         STATICGUIDOF(guid),\
  1068.         (interface),\
  1069.         0\
  1070.     }
  1071.  
  1072. #define DEFINE_KSPIN_MEDIUM_TABLE( tablename )\
  1073.     const KSPIN_MEDIUM tablename[] =
  1074.  
  1075. #define DEFINE_KSPIN_MEDIUM_ITEM(guid, medium)\
  1076.     DEFINE_KSPIN_INTERFACE_ITEM(guid, medium)
  1077.  
  1078. #define DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(Handler)\
  1079.     DEFINE_KSPROPERTY_ITEM(\
  1080.         KSPROPERTY_PIN_CINSTANCES,\
  1081.         (Handler),\
  1082.         sizeof(KSP_PIN),\
  1083.         sizeof(KSPIN_CINSTANCES),\
  1084.         NULL, NULL, 0, NULL, NULL, 0)
  1085.  
  1086. #define DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(Handler)\
  1087.     DEFINE_KSPROPERTY_ITEM(\
  1088.         KSPROPERTY_PIN_CTYPES,\
  1089.         (Handler),\
  1090.         sizeof(KSPROPERTY),\
  1091.         sizeof(ULONG),\
  1092.         NULL, NULL, 0, NULL, NULL, 0)
  1093.  
  1094. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(Handler)\
  1095.     DEFINE_KSPROPERTY_ITEM(\
  1096.         KSPROPERTY_PIN_DATAFLOW,\
  1097.         (Handler),\
  1098.         sizeof(KSP_PIN),\
  1099.         sizeof(KSPIN_DATAFLOW),\
  1100.         NULL, NULL, 0, NULL, NULL, 0)
  1101.  
  1102. #define DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(Handler)\
  1103.     DEFINE_KSPROPERTY_ITEM(\
  1104.         KSPROPERTY_PIN_DATARANGES,\
  1105.         (Handler),\
  1106.         sizeof(KSP_PIN),\
  1107.         0,\
  1108.         NULL, NULL, 0, NULL, NULL, 0)
  1109.  
  1110. #define DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(Handler)\
  1111.     DEFINE_KSPROPERTY_ITEM(\
  1112.         KSPROPERTY_PIN_DATAINTERSECTION,\
  1113.         (Handler),\
  1114.         sizeof(KSP_PIN) + sizeof(KSMULTIPLE_ITEM),\
  1115.         0,\
  1116.         NULL, NULL, 0, NULL, NULL, 0)
  1117.  
  1118. #define DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(Handler)\
  1119.     DEFINE_KSPROPERTY_ITEM(\
  1120.         KSPROPERTY_PIN_INTERFACES,\
  1121.         (Handler),\
  1122.         sizeof(KSP_PIN),\
  1123.         0,\
  1124.         NULL, NULL, 0, NULL, NULL, 0)
  1125.  
  1126. #define DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(Handler)\
  1127.     DEFINE_KSPROPERTY_ITEM(\
  1128.         KSPROPERTY_PIN_MEDIUMS,\
  1129.         (Handler),\
  1130.         sizeof(KSP_PIN),\
  1131.         0,\
  1132.         NULL, NULL, 0, NULL, NULL, 0)
  1133.  
  1134. #define DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(Handler)\
  1135.     DEFINE_KSPROPERTY_ITEM(\
  1136.         KSPROPERTY_PIN_COMMUNICATION,\
  1137.         (Handler),\
  1138.         sizeof(KSP_PIN),\
  1139.         sizeof(KSPIN_COMMUNICATION),\
  1140.         NULL, NULL, 0, NULL, NULL, 0)
  1141.  
  1142. #define DEFINE_KSPROPERTY_ITEM_PIN_GLOBALCINSTANCES(Handler)\
  1143.     DEFINE_KSPROPERTY_ITEM(\
  1144.         KSPROPERTY_PIN_GLOBALCINSTANCES,\
  1145.         (Handler),\
  1146.         sizeof(KSP_PIN),\
  1147.         sizeof(KSPIN_CINSTANCES),\
  1148.         NULL, NULL, 0, NULL, NULL, 0)
  1149.  
  1150. #define DEFINE_KSPROPERTY_ITEM_PIN_NECESSARYINSTANCES(Handler)\
  1151.     DEFINE_KSPROPERTY_ITEM(\
  1152.         KSPROPERTY_PIN_NECESSARYINSTANCES,\
  1153.         (Handler),\
  1154.         sizeof(KSP_PIN),\
  1155.         sizeof(ULONG),\
  1156.         NULL, NULL, 0, NULL, NULL, 0)
  1157.  
  1158. #define DEFINE_KSPROPERTY_ITEM_PIN_PHYSICALCONNECTION(Handler)\
  1159.     DEFINE_KSPROPERTY_ITEM(\
  1160.         KSPROPERTY_PIN_PHYSICALCONNECTION,\
  1161.         (Handler),\
  1162.         sizeof(KSP_PIN),\
  1163.         0,\
  1164.         NULL, NULL, 0, NULL, NULL, 0)
  1165.  
  1166. #define DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(Handler)\
  1167.     DEFINE_KSPROPERTY_ITEM(\
  1168.         KSPROPERTY_PIN_CATEGORY,\
  1169.         (Handler),\
  1170.         sizeof(KSP_PIN),\
  1171.         sizeof(GUID),\
  1172.         NULL, NULL, 0, NULL, NULL, 0)
  1173.  
  1174. #define DEFINE_KSPROPERTY_ITEM_PIN_NAME(Handler)\
  1175.     DEFINE_KSPROPERTY_ITEM(\
  1176.         KSPROPERTY_PIN_NAME,\
  1177.         (Handler),\
  1178.         sizeof(KSP_PIN),\
  1179.         0,\
  1180.         NULL, NULL, 0, NULL, NULL, 0)
  1181.  
  1182. #define DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(Handler)\
  1183.     DEFINE_KSPROPERTY_ITEM(\
  1184.         KSPROPERTY_PIN_CONSTRAINEDDATARANGES,\
  1185.         (Handler),\
  1186.         sizeof(KSP_PIN),\
  1187.         0,\
  1188.         NULL, NULL, 0, NULL, NULL, 0)
  1189.  
  1190. #define DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(Handler)\
  1191.     DEFINE_KSPROPERTY_ITEM(\
  1192.         KSPROPERTY_PIN_PROPOSEDATAFORMAT,\
  1193.         NULL,\
  1194.         sizeof(KSP_PIN),\
  1195.         sizeof(KSDATAFORMAT),\
  1196.         (Handler), NULL, 0, NULL, NULL, 0)
  1197.  
  1198. #define DEFINE_KSPROPERTY_PINSET(PinSet,\
  1199.     PropGeneral, PropInstances, PropIntersection)\
  1200. DEFINE_KSPROPERTY_TABLE(PinSet) {\
  1201.     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  1202.     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  1203.     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  1204.     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  1205.     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  1206.     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  1207.     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  1208.     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  1209.     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  1210.     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral)\
  1211. }
  1212.  
  1213. #define DEFINE_KSPROPERTY_PINSETCONSTRAINED(PinSet,\
  1214.     PropGeneral, PropInstances, PropIntersection)\
  1215. DEFINE_KSPROPERTY_TABLE(PinSet) {\
  1216.     DEFINE_KSPROPERTY_ITEM_PIN_CINSTANCES(PropInstances),\
  1217.     DEFINE_KSPROPERTY_ITEM_PIN_CTYPES(PropGeneral),\
  1218.     DEFINE_KSPROPERTY_ITEM_PIN_DATAFLOW(PropGeneral),\
  1219.     DEFINE_KSPROPERTY_ITEM_PIN_DATARANGES(PropGeneral),\
  1220.     DEFINE_KSPROPERTY_ITEM_PIN_DATAINTERSECTION(PropIntersection),\
  1221.     DEFINE_KSPROPERTY_ITEM_PIN_INTERFACES(PropGeneral),\
  1222.     DEFINE_KSPROPERTY_ITEM_PIN_MEDIUMS(PropGeneral),\
  1223.     DEFINE_KSPROPERTY_ITEM_PIN_COMMUNICATION(PropGeneral),\
  1224.     DEFINE_KSPROPERTY_ITEM_PIN_CATEGORY(PropGeneral),\
  1225.     DEFINE_KSPROPERTY_ITEM_PIN_NAME(PropGeneral),\
  1226.     DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral)\
  1227. }
  1228.  
  1229. #define STATIC_KSNAME_Filter\
  1230.     0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1231. DEFINE_GUIDSTRUCT("9b365890-165f-11d0-a195-0020afd156e4", KSNAME_Filter);
  1232. #define KSNAME_Filter DEFINE_GUIDNAMED(KSNAME_Filter)
  1233.  
  1234. #define KSSTRING_Filter L"{9B365890-165F-11D0-A195-0020AFD156E4}"
  1235.  
  1236. #define STATIC_KSNAME_Pin\
  1237.     0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1238. DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
  1239. #define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
  1240.  
  1241. #define KSSTRING_Pin L"{146F1A80-4791-11D0-A5D6-28DB04C10000}"
  1242.  
  1243. #define STATIC_KSNAME_Clock\
  1244.     0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1245. DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSNAME_Clock);
  1246. #define KSNAME_Clock DEFINE_GUIDNAMED(KSNAME_Clock)
  1247.  
  1248. #define KSSTRING_Clock L"{53172480-4791-11D0-A5D6-28DB04C10000}"
  1249.  
  1250. #define STATIC_KSNAME_Allocator\
  1251.     0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1252. DEFINE_GUIDSTRUCT("642F5D00-4791-11D0-A5D6-28DB04C10000", KSNAME_Allocator);
  1253. #define KSNAME_Allocator DEFINE_GUIDNAMED(KSNAME_Allocator)
  1254.  
  1255. #define KSSTRING_Allocator L"{642F5D00-4791-11D0-A5D6-28DB04C10000}"
  1256.  
  1257. #define KSSTRING_AllocatorEx L"{091BB63B-603F-11D1-B067-00A0C9062802}"
  1258.  
  1259. #define STATIC_KSNAME_TopologyNode\
  1260.     0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1261. DEFINE_GUIDSTRUCT("0621061A-EE75-11D0-B915-00A0C9223196", KSNAME_TopologyNode);
  1262. #define KSNAME_TopologyNode DEFINE_GUIDNAMED(KSNAME_TopologyNode)
  1263.  
  1264. #define KSSTRING_TopologyNode L"{0621061A-EE75-11D0-B915-00A0C9223196}"
  1265.  
  1266. #if defined(_NTDDK_)
  1267.  
  1268. typedef struct {
  1269.     ULONG                   InterfacesCount;
  1270.     const KSPIN_INTERFACE*  Interfaces;
  1271.     ULONG                   MediumsCount;
  1272.     const KSPIN_MEDIUM*     Mediums;
  1273.     ULONG                   DataRangesCount;
  1274.     const PKSDATARANGE*     DataRanges;
  1275.     KSPIN_DATAFLOW          DataFlow;
  1276.     KSPIN_COMMUNICATION     Communication;
  1277.     const GUID*             Category;
  1278.     const GUID*             Name;
  1279.     union {
  1280.         LONGLONG            Reserved;
  1281.         struct {
  1282.             ULONG           ConstrainedDataRangesCount;
  1283.             PKSDATARANGE*   ConstrainedDataRanges;
  1284.         };
  1285.     };
  1286. } KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
  1287. typedef const KSPIN_DESCRIPTOR *PCKSPIN_DESCRIPTOR;
  1288.  
  1289. #define DEFINE_KSPIN_DESCRIPTOR_TABLE(tablename)\
  1290.     const KSPIN_DESCRIPTOR tablename[] =
  1291.  
  1292. #define DEFINE_KSPIN_DESCRIPTOR_ITEM(\
  1293.     InterfacesCount, Interfaces,\
  1294.     MediumsCount, Mediums,\
  1295.     DataRangesCount, DataRanges,\
  1296.     DataFlow, Communication)\
  1297. {\
  1298.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  1299.     DataRangesCount, DataRanges, DataFlow, Communication,\
  1300.     NULL, NULL, 0\
  1301. }
  1302. #define DEFINE_KSPIN_DESCRIPTOR_ITEMEX(\
  1303.     InterfacesCount, Interfaces,\
  1304.     MediumsCount, Mediums,\
  1305.     DataRangesCount, DataRanges,\
  1306.     DataFlow, Communication,\
  1307.     Category, Name)\
  1308. {\
  1309.     InterfacesCount, Interfaces, MediumsCount, Mediums,\
  1310.     DataRangesCount, DataRanges, DataFlow, Communication,\
  1311.     Category, Name, 0\
  1312. }
  1313.  
  1314. #endif // defined(_NTDDK_)
  1315.  
  1316. //===========================================================================
  1317.  
  1318. // MEDIATYPE_NULL
  1319. #define STATIC_KSDATAFORMAT_TYPE_WILDCARD       STATIC_GUID_NULL
  1320. #define KSDATAFORMAT_TYPE_WILDCARD              GUID_NULL
  1321.  
  1322. // MEDIASUBTYPE_NULL
  1323. #define STATIC_KSDATAFORMAT_SUBTYPE_WILDCARD    STATIC_GUID_NULL
  1324. #define KSDATAFORMAT_SUBTYPE_WILDCARD           GUID_NULL
  1325.  
  1326. // MEDIATYPE_Stream
  1327. #define STATIC_KSDATAFORMAT_TYPE_STREAM\
  1328.     0xE436EB83L, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  1329. DEFINE_GUIDSTRUCT("E436EB83-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_TYPE_STREAM);
  1330. #define KSDATAFORMAT_TYPE_STREAM DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_STREAM)
  1331.  
  1332. // MEDIASUBTYPE_None
  1333. #define STATIC_KSDATAFORMAT_SUBTYPE_NONE\
  1334.     0xE436EB8EL, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70
  1335. DEFINE_GUIDSTRUCT("E436EB8E-524F-11CE-9F53-0020AF0BA770", KSDATAFORMAT_SUBTYPE_NONE);
  1336. #define KSDATAFORMAT_SUBTYPE_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_NONE)
  1337.  
  1338. #define STATIC_KSDATAFORMAT_SPECIFIER_WILDCARD  STATIC_GUID_NULL
  1339. #define KSDATAFORMAT_SPECIFIER_WILDCARD         GUID_NULL
  1340.  
  1341. #define STATIC_KSDATAFORMAT_SPECIFIER_FILENAME\
  1342.     0xAA797B40L, 0xE974, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1343. DEFINE_GUIDSTRUCT("AA797B40-E974-11CF-A5D6-28DB04C10000", KSDATAFORMAT_SPECIFIER_FILENAME);
  1344. #define KSDATAFORMAT_SPECIFIER_FILENAME DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILENAME)
  1345.  
  1346. #define STATIC_KSDATAFORMAT_SPECIFIER_FILEHANDLE\
  1347.     0x65E8773CL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1348. DEFINE_GUIDSTRUCT("65E8773C-8F56-11D0-A3B9-00A0C9223196", KSDATAFORMAT_SPECIFIER_FILEHANDLE);
  1349. #define KSDATAFORMAT_SPECIFIER_FILEHANDLE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_FILEHANDLE)
  1350.  
  1351. // FORMAT_None
  1352. #define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
  1353.     0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  1354. DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
  1355. #define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
  1356.  
  1357. //===========================================================================
  1358.  
  1359. #define STATIC_KSPROPSETID_Quality \
  1360.     0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1361. DEFINE_GUIDSTRUCT("D16AD380-AC1A-11CF-A5D6-28DB04C10000", KSPROPSETID_Quality);
  1362. #define KSPROPSETID_Quality DEFINE_GUIDNAMED(KSPROPSETID_Quality)
  1363.  
  1364. typedef enum {
  1365.     KSPROPERTY_QUALITY_REPORT,
  1366.     KSPROPERTY_QUALITY_ERROR
  1367. } KSPROPERTY_QUALITY;
  1368.  
  1369. #define DEFINE_KSPROPERTY_ITEM_QUALITY_REPORT(GetHandler, SetHandler)\
  1370.     DEFINE_KSPROPERTY_ITEM(\
  1371.         KSPROPERTY_QUALITY_REPORT,\
  1372.         (GetHandler),\
  1373.         sizeof(KSPROPERTY),\
  1374.         sizeof(KSQUALITY),\
  1375.         (SetHandler),\
  1376.         NULL, 0, NULL, NULL, 0)
  1377.  
  1378. #define DEFINE_KSPROPERTY_ITEM_QUALITY_ERROR(GetHandler, SetHandler)\
  1379.     DEFINE_KSPROPERTY_ITEM(\
  1380.         KSPROPERTY_QUALITY_ERROR,\
  1381.         (GetHandler),\
  1382.         sizeof(KSPROPERTY),\
  1383.         sizeof(KSERROR),\
  1384.         (SetHandler),\
  1385.         NULL, 0, NULL, NULL, 0)
  1386.  
  1387. //===========================================================================
  1388.  
  1389. #define STATIC_KSPROPSETID_Connection \
  1390.     0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  1391. DEFINE_GUIDSTRUCT("1D58C920-AC9B-11CF-A5D6-28DB04C10000", KSPROPSETID_Connection);
  1392. #define KSPROPSETID_Connection DEFINE_GUIDNAMED(KSPROPSETID_Connection)
  1393.  
  1394. typedef enum {
  1395.     KSPROPERTY_CONNECTION_STATE,
  1396.     KSPROPERTY_CONNECTION_PRIORITY,
  1397.     KSPROPERTY_CONNECTION_DATAFORMAT,
  1398.     KSPROPERTY_CONNECTION_ALLOCATORFRAMING,
  1399.     KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,
  1400.     KSPROPERTY_CONNECTION_ACQUIREORDERING,
  1401.     KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,
  1402.     KSPROPERTY_CONNECTION_STARTAT
  1403. } KSPROPERTY_CONNECTION;
  1404.  
  1405. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(GetHandler, SetHandler)\
  1406.     DEFINE_KSPROPERTY_ITEM(\
  1407.         KSPROPERTY_CONNECTION_STATE,\
  1408.         (GetHandler),\
  1409.         sizeof(KSPROPERTY),\
  1410.         sizeof(KSSTATE),\
  1411.         (SetHandler),\
  1412.         NULL, 0, NULL, NULL, 0)
  1413.  
  1414. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PRIORITY(GetHandler, SetHandler)\
  1415.     DEFINE_KSPROPERTY_ITEM(\
  1416.         KSPROPERTY_CONNECTION_PRIORITY,\
  1417.         (GetHandler),\
  1418.         sizeof(KSPROPERTY),\
  1419.         sizeof(KSPRIORITY),\
  1420.         (SetHandler),\
  1421.         NULL, 0, NULL, NULL, 0)
  1422.  
  1423. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(GetHandler, SetHandler)\
  1424.     DEFINE_KSPROPERTY_ITEM(\
  1425.         KSPROPERTY_CONNECTION_DATAFORMAT,\
  1426.         (GetHandler),\
  1427.         sizeof(KSPROPERTY),\
  1428.         0,\
  1429.         (SetHandler),\
  1430.         NULL, 0, NULL, NULL, 0)
  1431.  
  1432. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING(Handler)\
  1433.     DEFINE_KSPROPERTY_ITEM(\
  1434.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING,\
  1435.         (Handler),\
  1436.         sizeof(KSPROPERTY),\
  1437.         sizeof(KSALLOCATOR_FRAMING),\
  1438.         NULL, NULL, 0, NULL, NULL, 0)
  1439.         
  1440. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(Handler)\
  1441.     DEFINE_KSPROPERTY_ITEM(\
  1442.         KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX,\
  1443.         (Handler),\
  1444.         sizeof(KSPROPERTY),\
  1445.         0,\
  1446.         NULL, NULL, 0, NULL, NULL, 0)
  1447.  
  1448. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_PROPOSEDATAFORMAT(Handler)\
  1449.     DEFINE_KSPROPERTY_ITEM(\
  1450.         KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT,\
  1451.         NULL,\
  1452.         sizeof(KSPROPERTY),\
  1453.         sizeof(KSDATAFORMAT),\
  1454.         (Handler),\
  1455.         NULL, 0, NULL, NULL, 0)
  1456.  
  1457. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_ACQUIREORDERING(Handler)\
  1458.     DEFINE_KSPROPERTY_ITEM(\
  1459.         KSPROPERTY_CONNECTION_ACQUIREORDERING,\
  1460.         (Handler),\
  1461.         sizeof(KSPROPERTY),\
  1462.         sizeof(int),\
  1463.         NULL, NULL, 0, NULL, NULL, 0)
  1464.  
  1465. #define DEFINE_KSPROPERTY_ITEM_CONNECTION_STARTAT(Handler)\
  1466.     DEFINE_KSPROPERTY_ITEM(\
  1467.         KSPROPERTY_CONNECTION_STARTAT,\
  1468.         NULL,\
  1469.         sizeof(KSPROPERTY),\
  1470.         sizeof(KSRELATIVEEVENT),\
  1471.         (Handler),\
  1472.         NULL, 0, NULL, NULL, 0)
  1473.  
  1474. //===========================================================================
  1475. //
  1476. // pins flags
  1477. //
  1478. #define KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER   0x00000001
  1479. #define KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY      0x00000002
  1480. #define KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY    0x00000004
  1481. #define KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE      0x00000008
  1482. #define KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY   0x80000000
  1483.  
  1484. #define KSALLOCATOR_OPTIONF_COMPATIBLE              0x00000001
  1485. #define KSALLOCATOR_OPTIONF_SYSTEM_MEMORY           0x00000002
  1486. #define KSALLOCATOR_OPTIONF_VALID                   0x00000003
  1487. // 
  1488. // pins extended framing flags
  1489. //
  1490. #define KSALLOCATOR_FLAG_PARTIAL_READ_SUPPORT       0x00000010
  1491. #define KSALLOCATOR_FLAG_DEVICE_SPECIFIC            0x00000020
  1492. #define KSALLOCATOR_FLAG_CAN_ALLOCATE               0x00000040
  1493. #define KSALLOCATOR_FLAG_INSIST_ON_FRAMESIZE_RATIO  0x00000080
  1494. //
  1495. // allocator pipes flags
  1496. //
  1497. // there is at least one data modification in a pipe
  1498. #define KSALLOCATOR_FLAG_NO_FRAME_INTEGRITY         0x00000100
  1499. #define KSALLOCATOR_FLAG_MULTIPLE_OUTPUT            0x00000200
  1500. #define KSALLOCATOR_FLAG_CYCLE                      0x00000400
  1501. #define KSALLOCATOR_FLAG_ALLOCATOR_EXISTS           0x00000800
  1502. // there is no framing dependency between neighbouring pipes.
  1503. #define KSALLOCATOR_FLAG_INDEPENDENT_RANGES         0x00001000
  1504. #define KSALLOCATOR_FLAG_ATTENTION_STEPPING         0x00002000
  1505.  
  1506.  
  1507. //
  1508. // old Framing structure
  1509. //
  1510. typedef struct {
  1511.     union {
  1512.         ULONG       OptionsFlags;       // allocator options (create)
  1513.         ULONG       RequirementsFlags;  // allocation requirements (query)
  1514.     };
  1515. #if defined(_NTDDK_)
  1516.     POOL_TYPE   PoolType;
  1517. #else // !_NTDDK_
  1518.     ULONG       PoolType;
  1519. #endif // !_NTDDK_
  1520.     ULONG       Frames;     // total number of allowable outstanding frames
  1521.     ULONG       FrameSize;  // total size of frame
  1522.     ULONG       FileAlignment;
  1523.     ULONG       Reserved;
  1524. } KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
  1525.  
  1526. #if defined(_NTDDK_)
  1527. typedef
  1528. PVOID
  1529. (*PFNKSDEFAULTALLOCATE)(
  1530.     IN PVOID Context
  1531.     );
  1532.  
  1533. typedef
  1534. VOID
  1535. (*PFNKSDEFAULTFREE)(
  1536.     IN PVOID Context,
  1537.     IN PVOID Buffer
  1538.     );
  1539.  
  1540. typedef
  1541. NTSTATUS
  1542. (*PFNKSINITIALIZEALLOCATOR)(
  1543.     IN PVOID InitialContext,
  1544.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  1545.     OUT PVOID* Context
  1546.     );
  1547.  
  1548. typedef
  1549. VOID
  1550. (*PFNKSDELETEALLOCATOR)(
  1551.     IN PVOID Context
  1552.     );
  1553. #endif // !_NTDDK_
  1554.  
  1555. //
  1556. // new Framing structure, eventually will replace KSALLOCATOR_FRAMING.
  1557. // 
  1558. typedef struct {
  1559.     ULONG   MinFrameSize;
  1560.     ULONG   MaxFrameSize;
  1561.     ULONG   Stepping;
  1562. } KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
  1563.  
  1564.  
  1565. typedef struct {
  1566.     KS_FRAMING_RANGE  Range;
  1567.     ULONG             InPlaceWeight;
  1568.     ULONG             NotInPlaceWeight;
  1569. } KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
  1570.  
  1571.  
  1572. typedef struct {
  1573.     ULONG   RatioNumerator;      // compression/expansion ratio
  1574.     ULONG   RatioDenominator; 
  1575.     ULONG   RatioConstantMargin;
  1576. } KS_COMPRESSION, *PKS_COMPRESSION;
  1577.  
  1578.  
  1579. //
  1580. // Memory Types and Buses are repeated in each entry.
  1581. // Easiest to use but takes a little more memory than the varsize layout Pin\Memories\Buses\Ranges.
  1582. //
  1583. typedef struct {
  1584.     GUID                        MemoryType;
  1585.     GUID                        BusType;
  1586.     ULONG                       MemoryFlags;
  1587.     ULONG                       BusFlags;   
  1588.     ULONG                       Flags;   
  1589.     ULONG                       Frames;              // total number of allowable outstanding frames
  1590.     ULONG                       FileAlignment;
  1591.     ULONG                       MemoryTypeWeight;    // this memory type Weight pin-wide
  1592.     KS_FRAMING_RANGE            PhysicalRange;
  1593.     KS_FRAMING_RANGE_WEIGHTED   FramingRange; 
  1594. } KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
  1595.  
  1596.  
  1597. typedef struct {
  1598.     ULONG               CountItems;         // count of FramingItem-s below.
  1599.     ULONG               PinFlags;
  1600.     KS_COMPRESSION      OutputCompression;
  1601.     ULONG               PinWeight;          // this pin framing's Weight graph-wide
  1602.     KS_FRAMING_ITEM     FramingItem[1]; 
  1603. } KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
  1604.  
  1605.  
  1606.  
  1607. //
  1608. // define memory type GUIDs
  1609. //
  1610. #define KSMEMORY_TYPE_WILDCARD          GUID_NULL
  1611. #define STATIC_KSMEMORY_TYPE_WILDCARD   STATIC_GUID_NULL
  1612.  
  1613. #define KSMEMORY_TYPE_DONT_CARE         GUID_NULL
  1614. #define STATIC_KSMEMORY_TYPE_DONT_CARE  STATIC_GUID_NULL
  1615.  
  1616. #define KS_TYPE_DONT_CARE           GUID_NULL
  1617. #define STATIC_KS_TYPE_DONT_CARE    STATIC_GUID_NULL
  1618.      
  1619. #define STATIC_KSMEMORY_TYPE_SYSTEM \
  1620.     0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1621. DEFINE_GUIDSTRUCT("091bb638-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_SYSTEM);
  1622. #define KSMEMORY_TYPE_SYSTEM  DEFINE_GUIDNAMED(KSMEMORY_TYPE_SYSTEM)
  1623.  
  1624. #define STATIC_KSMEMORY_TYPE_USER \
  1625.     0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1626. DEFINE_GUIDSTRUCT("8cb0fc28-7893-11d1-b069-00a0c9062802", KSMEMORY_TYPE_USER);
  1627. #define KSMEMORY_TYPE_USER  DEFINE_GUIDNAMED(KSMEMORY_TYPE_USER)
  1628.  
  1629. #define STATIC_KSMEMORY_TYPE_KERNEL_PAGED \
  1630.     0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1631. DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_PAGED);
  1632. #define KSMEMORY_TYPE_KERNEL_PAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_PAGED)
  1633.  
  1634. #define STATIC_KSMEMORY_TYPE_KERNEL_NONPAGED \
  1635.     0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1636. DEFINE_GUIDSTRUCT("4a6d5fc4-7895-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_NONPAGED);
  1637. #define KSMEMORY_TYPE_KERNEL_NONPAGED  DEFINE_GUIDNAMED(KSMEMORY_TYPE_KERNEL_NONPAGED)
  1638.  
  1639. // old KS clients did not specify the device memory type
  1640. #define STATIC_KSMEMORY_TYPE_DEVICE_UNKNOWN \
  1641.     0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02
  1642. DEFINE_GUIDSTRUCT("091bb639-603f-11d1-b067-00a0c9062802", KSMEMORY_TYPE_DEVICE_UNKNOWN);
  1643. #define KSMEMORY_TYPE_DEVICE_UNKNOWN DEFINE_GUIDNAMED(KSMEMORY_TYPE_DEVICE_UNKNOWN)
  1644.  
  1645. //
  1646. // Helper framing macros.
  1647. //
  1648. #define DECLARE_SIMPLE_FRAMING_EX(FramingExName, MemoryType, Flags, Frames, Alignment, MinFrameSize, MaxFrameSize) \
  1649.     const KSALLOCATOR_FRAMING_EX FramingExName = \
  1650.     {\
  1651.         1, \
  1652.         0, \
  1653.         {\
  1654.             1, \
  1655.             1, \
  1656.             0 \
  1657.         }, \
  1658.         0, \
  1659.         {\
  1660.             {\
  1661.                 MemoryType, \
  1662.                 STATIC_KS_TYPE_DONT_CARE, \
  1663.                 0, \
  1664.                 0, \
  1665.                 Flags, \
  1666.                 Frames, \
  1667.                 Alignment, \
  1668.                 0, \
  1669.                 {\
  1670.                     0, \
  1671.                     (ULONG)-1, \
  1672.                     1 \
  1673.                 }, \
  1674.                 {\
  1675.                     {\
  1676.                         MinFrameSize, \
  1677.                         MaxFrameSize, \
  1678.                         1 \
  1679.                     }, \
  1680.                     0, \
  1681.                     0  \
  1682.                 }\
  1683.             }\
  1684.         }\
  1685.     }
  1686.  
  1687. #define SetDefaultKsCompression(KsCompressionPointer) \
  1688. {\
  1689.     KsCompressionPointer->RatioNumerator = 1;\
  1690.     KsCompressionPointer->RatioDenominator = 1;\
  1691.     KsCompressionPointer->RatioConstantMargin = 0;\
  1692. }
  1693.  
  1694. #define SetDontCareKsFramingRange(KsFramingRangePointer) \
  1695. {\
  1696.     KsFramingRangePointer->MinFrameSize = 0;\
  1697.     KsFramingRangePointer->MaxFrameSize = (ULONG) -1;\
  1698.     KsFramingRangePointer->Stepping = 1;\
  1699. }
  1700.  
  1701. #define SetKsFramingRange(KsFramingRangePointer, P_MinFrameSize, P_MaxFrameSize) \
  1702. {\
  1703.     KsFramingRangePointer->MinFrameSize = P_MinFrameSize;\
  1704.     KsFramingRangePointer->MaxFrameSize = P_MaxFrameSize;\
  1705.     KsFramingRangePointer->Stepping = 1;\
  1706. }
  1707.  
  1708. #define SetKsFramingRangeWeighted(KsFramingRangeWeightedPointer, P_MinFrameSize, P_MaxFrameSize) \
  1709. {\
  1710.     KS_FRAMING_RANGE *KsFramingRange = &KsFramingRangeWeightedPointer->Range;\
  1711.     SetKsFramingRange(KsFramingRange, P_MinFrameSize, P_MaxFrameSize);\
  1712.     KsFramingRangeWeightedPointer->InPlaceWeight = 0;\
  1713.     KsFramingRangeWeightedPointer->NotInPlaceWeight = 0;\
  1714. }
  1715.  
  1716. #define INITIALIZE_SIMPLE_FRAMING_EX(FramingExPointer, P_MemoryType, P_Flags, P_Frames, P_Alignment, P_MinFrameSize, P_MaxFrameSize) \
  1717. {\
  1718.     KS_COMPRESSION *KsCompression = &FramingExPointer->OutputCompression;\
  1719.     KS_FRAMING_RANGE *KsFramingRange = &FramingExPointer->FramingItem[0].PhysicalRange;\
  1720.     KS_FRAMING_RANGE_WEIGHTED *KsFramingRangeWeighted = &FramingExPointer->FramingItem[0].FramingRange;\
  1721.     FramingExPointer->CountItems = 1;\
  1722.     FramingExPointer->PinFlags = 0;\
  1723.     SetDefaultKsCompression(KsCompression);\
  1724.     FramingExPointer->PinWeight = 0;\
  1725.     FramingExPointer->FramingItem[0].MemoryType = P_MemoryType;\
  1726.     FramingExPointer->FramingItem[0].BusType = KS_TYPE_DONT_CARE;\
  1727.     FramingExPointer->FramingItem[0].MemoryFlags = 0;\
  1728.     FramingExPointer->FramingItem[0].BusFlags = 0;\
  1729.     FramingExPointer->FramingItem[0].Flags = P_Flags;\
  1730.     FramingExPointer->FramingItem[0].Frames = P_Frames;\
  1731.     FramingExPointer->FramingItem[0].FileAlignment = P_Alignment;\
  1732.     FramingExPointer->FramingItem[0].MemoryTypeWeight = 0;\
  1733.     SetDontCareKsFramingRange(KsFramingRange);\
  1734.     SetKsFramingRangeWeighted(KsFramingRangeWeighted, P_MinFrameSize, P_MaxFrameSize);\
  1735. }
  1736.  
  1737.  
  1738.  
  1739. // KSEVENTSETID_StreamAllocator: {75D95571-073C-11d0-A161-0020AFD156E4}
  1740.  
  1741. #define STATIC_KSEVENTSETID_StreamAllocator\
  1742.     0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1743. DEFINE_GUIDSTRUCT("75d95571-073c-11d0-a161-0020afd156e4", KSEVENTSETID_StreamAllocator);
  1744. #define KSEVENTSETID_StreamAllocator DEFINE_GUIDNAMED(KSEVENTSETID_StreamAllocator)
  1745.  
  1746. typedef enum {
  1747.     KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME,
  1748.     KSEVENT_STREAMALLOCATOR_FREEFRAME
  1749. } KSEVENT_STREAMALLOCATOR;
  1750.  
  1751. #define STATIC_KSMETHODSETID_StreamAllocator\
  1752.     0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1753. DEFINE_GUIDSTRUCT("cf6e4341-ec87-11cf-a130-0020afd156e4", KSMETHODSETID_StreamAllocator);
  1754. #define KSMETHODSETID_StreamAllocator DEFINE_GUIDNAMED(KSMETHODSETID_StreamAllocator)
  1755.  
  1756. typedef enum {
  1757.     KSMETHOD_STREAMALLOCATOR_ALLOC,
  1758.     KSMETHOD_STREAMALLOCATOR_FREE
  1759. } KSMETHOD_STREAMALLOCATOR;
  1760.  
  1761. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(Handler)\
  1762.     DEFINE_KSMETHOD_ITEM(\
  1763.         KSMETHOD_STREAMALLOCATOR_ALLOC,\
  1764.         KSMETHOD_TYPE_WRITE,\
  1765.         (Handler),\
  1766.         sizeof(KSMETHOD),\
  1767.         sizeof(PVOID),\
  1768.         NULL)
  1769.  
  1770. #define DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(Handler)\
  1771.     DEFINE_KSMETHOD_ITEM(\
  1772.         KSMETHOD_STREAMALLOCATOR_FREE,\
  1773.         KSMETHOD_TYPE_READ,\
  1774.         (Handler),\
  1775.         sizeof(KSMETHOD),\
  1776.         sizeof(PVOID),\
  1777.         NULL)
  1778.  
  1779. #define DEFINE_KSMETHOD_ALLOCATORSET(AllocatorSet, MethodAlloc, MethodFree)\
  1780. DEFINE_KSMETHOD_TABLE(AllocatorSet) {\
  1781.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_ALLOC(MethodAlloc),\
  1782.     DEFINE_KSMETHOD_ITEM_STREAMALLOCATOR_FREE(MethodFree)\
  1783. }
  1784.  
  1785. #define STATIC_KSPROPSETID_StreamAllocator\
  1786.     0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1787. DEFINE_GUIDSTRUCT("cf6e4342-ec87-11cf-a130-0020afd156e4", KSPROPSETID_StreamAllocator);
  1788. #define KSPROPSETID_StreamAllocator DEFINE_GUIDNAMED(KSPROPSETID_StreamAllocator)
  1789.  
  1790. #if defined(_NTDDK_)
  1791. typedef enum {
  1792.     KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,
  1793.     KSPROPERTY_STREAMALLOCATOR_STATUS
  1794. } KSPROPERTY_STREAMALLOCATOR;
  1795.  
  1796. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(Handler)\
  1797.     DEFINE_KSPROPERTY_ITEM(\
  1798.         KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE,\
  1799.         (Handler),\
  1800.         sizeof(KSPROPERTY),\
  1801.         sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE),\
  1802.         NULL, NULL, 0, NULL, NULL, 0)
  1803.         
  1804. #define DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(Handler)\
  1805.     DEFINE_KSPROPERTY_ITEM(\
  1806.         KSPROPERTY_STREAMALLOCATOR_STATUS,\
  1807.         (Handler),\
  1808.         sizeof(KSPROPERTY),\
  1809.         sizeof(KSSTREAMALLOCATOR_STATUS),\
  1810.         NULL, NULL, 0, NULL, NULL, 0)
  1811.  
  1812. #define DEFINE_KSPROPERTY_ALLOCATORSET(AllocatorSet, PropFunctionTable, PropStatus)\
  1813. DEFINE_KSPROPERTY_TABLE(AllocatorSet) {\
  1814.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_STATUS(PropStatus),\
  1815.     DEFINE_KSPROPERTY_ITEM_STREAMALLOCATOR_FUNCTIONTABLE(PropFunctionTable)\
  1816. }
  1817.  
  1818. typedef
  1819. NTSTATUS
  1820. (*PFNALLOCATOR_ALLOCATEFRAME)(
  1821.     IN PFILE_OBJECT FileObject,
  1822.     PVOID *Frame
  1823.     );
  1824.  
  1825. typedef
  1826. VOID
  1827. (*PFNALLOCATOR_FREEFRAME)(
  1828.     IN PFILE_OBJECT FileObject,
  1829.     IN PVOID Frame
  1830.     );
  1831.  
  1832. typedef struct {
  1833.     PFNALLOCATOR_ALLOCATEFRAME  AllocateFrame;
  1834.     PFNALLOCATOR_FREEFRAME      FreeFrame;
  1835. } KSSTREAMALLOCATOR_FUNCTIONTABLE, *PKSSTREAMALLOCATOR_FUNCTIONTABLE;
  1836. #endif // defined(_NTDDK_)
  1837.  
  1838. typedef struct {
  1839.     KSALLOCATOR_FRAMING Framing;
  1840.     ULONG               AllocatedFrames;
  1841.     ULONG               Reserved;
  1842. } KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS;
  1843.  
  1844. typedef struct {
  1845.     KSALLOCATOR_FRAMING_EX Framing;
  1846.     ULONG                  AllocatedFrames;
  1847.     ULONG                  Reserved;
  1848. } KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX;
  1849.  
  1850.  
  1851. #define KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT        0x00000001
  1852. #define KSSTREAM_HEADER_OPTIONSF_PREROLL            0x00000002
  1853. #define KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY  0x00000004
  1854. #define KSSTREAM_HEADER_OPTIONSF_TYPECHANGED        0x00000008
  1855. #define KSSTREAM_HEADER_OPTIONSF_TIMEVALID          0x00000010
  1856. #define KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY  0x00000040
  1857. #define KSSTREAM_HEADER_OPTIONSF_FLUSHONPAUSE       0x00000080
  1858. #define KSSTREAM_HEADER_OPTIONSF_DURATIONVALID      0x00000100
  1859. #define KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM        0x00000200
  1860. #define KSSTREAM_HEADER_OPTIONSF_LOOPEDDATA         0x80000000
  1861.  
  1862. typedef struct {
  1863.     LONGLONG    Time;
  1864.     ULONG       Numerator;
  1865.     ULONG       Denominator;
  1866. } KSTIME, *PKSTIME;
  1867.  
  1868. typedef struct {
  1869.     ULONG       Size;
  1870.     ULONG       TypeSpecificFlags;
  1871.     KSTIME      PresentationTime;
  1872.     LONGLONG    Duration;
  1873.     ULONG       FrameExtent;
  1874.     ULONG       DataUsed;
  1875.     PVOID       Data;
  1876.     ULONG       OptionsFlags;
  1877. #if _WIN64
  1878.     ULONG       Reserved;
  1879. #endif
  1880. } KSSTREAM_HEADER, *PKSSTREAM_HEADER;
  1881.  
  1882. #define STATIC_KSPROPSETID_StreamInterface\
  1883.     0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a
  1884. DEFINE_GUIDSTRUCT("1fdd8ee1-9cd3-11d0-82aa-0000f822fe8a", KSPROPSETID_StreamInterface);
  1885. #define KSPROPSETID_StreamInterface DEFINE_GUIDNAMED(KSPROPSETID_StreamInterface)
  1886.  
  1887. typedef enum {
  1888.     KSPROPERTY_STREAMINTERFACE_HEADERSIZE
  1889. } KSPROPERTY_STREAMINTERFACE;
  1890.  
  1891. #define DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( GetHandler )\
  1892.     DEFINE_KSPROPERTY_ITEM(\
  1893.         KSPROPERTY_STREAMINTERFACE_HEADERSIZE,\
  1894.         (GetHandler),\
  1895.         sizeof(KSPROPERTY),\
  1896.         sizeof(ULONG),\
  1897.         NULL, NULL, 0, NULL, NULL, 0)
  1898.         
  1899. #define DEFINE_KSPROPERTY_STREAMINTERFACESET(StreamInterfaceSet,\
  1900.     HeaderSizeHandler)\
  1901. DEFINE_KSPROPERTY_TABLE(StreamInterfaceSet) {\
  1902.     DEFINE_KSPROPERTY_ITEM_STREAMINTERFACE_HEADERSIZE( HeaderSizeHandler )\
  1903. }
  1904.  
  1905. #define STATIC_KSPROPSETID_Stream\
  1906.     0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
  1907. DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
  1908. #define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
  1909.  
  1910. typedef enum {
  1911.     KSPROPERTY_STREAM_ALLOCATOR,
  1912.     KSPROPERTY_STREAM_QUALITY,
  1913.     KSPROPERTY_STREAM_DEGRADATION,
  1914.     KSPROPERTY_STREAM_MASTERCLOCK,
  1915.     KSPROPERTY_STREAM_TIMEFORMAT,
  1916.     KSPROPERTY_STREAM_PRESENTATIONTIME,
  1917.     KSPROPERTY_STREAM_PRESENTATIONEXTENT,
  1918.     KSPROPERTY_STREAM_FRAMETIME,
  1919.     KSPROPERTY_STREAM_RATECAPABILITY,
  1920.     KSPROPERTY_STREAM_RATE,
  1921.     KSPROPERTY_STREAM_PIPE_ID
  1922. } KSPROPERTY_STREAM;
  1923.  
  1924. #define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\
  1925.     DEFINE_KSPROPERTY_ITEM(\
  1926.         KSPROPERTY_STREAM_ALLOCATOR,\
  1927.         (GetHandler),\
  1928.         sizeof(KSPROPERTY),\
  1929.         sizeof(HANDLE),\
  1930.         (SetHandler),\
  1931.         NULL, 0, NULL, NULL, 0)
  1932.  
  1933. #define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\
  1934.     DEFINE_KSPROPERTY_ITEM(\
  1935.         KSPROPERTY_STREAM_QUALITY,\
  1936.         (Handler),\
  1937.         sizeof(KSPROPERTY),\
  1938.         sizeof(KSQUALITY_MANAGER),\
  1939.         NULL, NULL, 0, NULL, NULL, 0)
  1940.  
  1941. #define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\
  1942.     DEFINE_KSPROPERTY_ITEM(\
  1943.         KSPROPERTY_STREAM_DEGRADATION,\
  1944.         (GetHandler),\
  1945.         sizeof(KSPROPERTY),\
  1946.         0,\
  1947.         (SetHandler),\
  1948.         NULL, 0, NULL, NULL, 0)
  1949.  
  1950. #define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\
  1951.     DEFINE_KSPROPERTY_ITEM(\
  1952.         KSPROPERTY_STREAM_MASTERCLOCK,\
  1953.         (GetHandler),\
  1954.         sizeof(KSPROPERTY),\
  1955.         sizeof(HANDLE),\
  1956.         (SetHandler),\
  1957.         NULL, 0, NULL, NULL, 0)
  1958.  
  1959. #define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\
  1960.     DEFINE_KSPROPERTY_ITEM(\
  1961.         KSPROPERTY_STREAM_TIMEFORMAT,\
  1962.         (Handler),\
  1963.         sizeof(KSPROPERTY),\
  1964.         sizeof(GUID),\
  1965.         NULL, NULL, 0, NULL, NULL, 0)
  1966.  
  1967. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\
  1968.     DEFINE_KSPROPERTY_ITEM(\
  1969.         KSPROPERTY_STREAM_PRESENTATIONTIME,\
  1970.         (GetHandler),\
  1971.         sizeof(KSPROPERTY),\
  1972.         sizeof(KSTIME),\
  1973.         (SetHandler),\
  1974.         NULL, 0, NULL, NULL, 0)
  1975.  
  1976. #define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\
  1977.     DEFINE_KSPROPERTY_ITEM(\
  1978.         KSPROPERTY_STREAM_PRESENTATIONEXTENT,\
  1979.         (Handler),\
  1980.         sizeof(KSPROPERTY),\
  1981.         sizeof(LONGLONG),\
  1982.         NULL, NULL, 0, NULL, NULL, 0)
  1983.  
  1984. #define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\
  1985.     DEFINE_KSPROPERTY_ITEM(\
  1986.         KSPROPERTY_STREAM_FRAMETIME,\
  1987.         (Handler),\
  1988.         sizeof(KSPROPERTY),\
  1989.         sizeof(KSFRAMETIME),\
  1990.         NULL, NULL, 0, NULL, NULL, 0)
  1991.  
  1992. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\
  1993.     DEFINE_KSPROPERTY_ITEM(\
  1994.         KSPROPERTY_STREAM_RATECAPABILITY,\
  1995.         (Handler),\
  1996.         sizeof(KSRATE_CAPABILITY),\
  1997.         sizeof(KSRATE),\
  1998.         NULL, NULL, 0, NULL, NULL, 0)
  1999.  
  2000. #define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\
  2001.     DEFINE_KSPROPERTY_ITEM(\
  2002.         KSPROPERTY_STREAM_RATE,\
  2003.         (GetHandler),\
  2004.         sizeof(KSPROPERTY),\
  2005.         sizeof(KSRATE),\
  2006.         (SetHandler),\
  2007.         NULL, 0, NULL, NULL, 0)
  2008.  
  2009. #define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\
  2010.     DEFINE_KSPROPERTY_ITEM(\
  2011.         KSPROPERTY_STREAM_PIPE_ID,\
  2012.         (GetHandler),\
  2013.         sizeof(KSPROPERTY),\
  2014.         sizeof(HANDLE),\
  2015.         (SetHandler),\
  2016.         NULL, 0, NULL, NULL, 0)
  2017.  
  2018. typedef struct {
  2019.     HANDLE      QualityManager;
  2020.     PVOID       Context;
  2021. } KSQUALITY_MANAGER, *PKSQUALITY_MANAGER;
  2022.  
  2023. typedef struct {
  2024.     LONGLONG    Duration;
  2025.     ULONG       FrameFlags;
  2026.     ULONG       Reserved;
  2027. } KSFRAMETIME, *PKSFRAMETIME;
  2028.  
  2029. #define KSFRAMETIME_VARIABLESIZE    0x00000001
  2030.  
  2031. typedef struct {
  2032.     LONGLONG        PresentationStart;
  2033.     LONGLONG        Duration;
  2034.     KSPIN_INTERFACE Interface;
  2035.     LONG            Rate;
  2036.     ULONG           Flags;
  2037. } KSRATE, *PKSRATE;
  2038.  
  2039. #define KSRATE_NOPRESENTATIONSTART      0x00000001
  2040. #define KSRATE_NOPRESENTATIONDURATION   0x00000002
  2041.  
  2042. typedef struct {
  2043.     KSPROPERTY      Property;
  2044.     KSRATE          Rate;
  2045. } KSRATE_CAPABILITY, *PKSRATE_CAPABILITY;
  2046.  
  2047. #define STATIC_KSPROPSETID_Clock \
  2048.     0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2049. DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
  2050. #define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
  2051.  
  2052. //
  2053. // Performs a x*y/z operation on 64 bit quantities by splitting the operation. The equation
  2054. // is simplified with respect to adding in the remainder for the upper 32 bits.
  2055. //
  2056. // (xh * 10000000 / Frequency) * 2^32 + ((((xh * 10000000) % Frequency) * 2^32 + (xl * 10000000)) / Frequency)
  2057. //
  2058. #define NANOSECONDS 10000000
  2059. #define KSCONVERT_PERFORMANCE_TIME(Frequency, PerformanceTime) \
  2060.     ((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS / (Frequency)) << 32) + \
  2061.     ((((((ULONGLONG)(ULONG)(PerformanceTime).HighPart * NANOSECONDS) % (Frequency)) << 32) + \
  2062.     ((ULONGLONG)(PerformanceTime).LowPart * NANOSECONDS)) / (Frequency)))
  2063.  
  2064. typedef struct {
  2065.     ULONG       CreateFlags;
  2066. } KSCLOCK_CREATE, *PKSCLOCK_CREATE;
  2067.  
  2068. typedef struct {
  2069.     LONGLONG    Time;
  2070.     LONGLONG    SystemTime;
  2071. } KSCORRELATED_TIME, *PKSCORRELATED_TIME;
  2072.  
  2073. typedef struct {
  2074.     LONGLONG    Granularity;
  2075.     LONGLONG    Error;
  2076. } KSRESOLUTION, *PKSRESOLUTION;
  2077.  
  2078. typedef enum {
  2079.     KSPROPERTY_CLOCK_TIME,
  2080.     KSPROPERTY_CLOCK_PHYSICALTIME,
  2081.     KSPROPERTY_CLOCK_CORRELATEDTIME,
  2082.     KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,
  2083.     KSPROPERTY_CLOCK_RESOLUTION,
  2084.     KSPROPERTY_CLOCK_STATE,
  2085. #if defined(_NTDDK_)
  2086.     KSPROPERTY_CLOCK_FUNCTIONTABLE
  2087. #endif // defined(_NTDDK_)
  2088. } KSPROPERTY_CLOCK;
  2089.  
  2090. #if defined(_NTDDK_)
  2091.  
  2092. typedef
  2093. LONGLONG
  2094. (FASTCALL *PFNKSCLOCK_GETTIME)(
  2095.     IN PFILE_OBJECT FileObject
  2096.     );
  2097. typedef
  2098. LONGLONG
  2099. (FASTCALL *PFNKSCLOCK_CORRELATEDTIME)(
  2100.     IN PFILE_OBJECT FileObject,
  2101.     OUT PLONGLONG SystemTime);
  2102.  
  2103. typedef struct {
  2104.     PFNKSCLOCK_GETTIME GetTime;
  2105.     PFNKSCLOCK_GETTIME GetPhysicalTime;
  2106.     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedTime;
  2107.     PFNKSCLOCK_CORRELATEDTIME GetCorrelatedPhysicalTime;
  2108. } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE;
  2109.  
  2110. typedef
  2111. BOOLEAN
  2112. (*PFNKSSETTIMER)(
  2113.     IN PVOID Context,
  2114.     IN PKTIMER Timer,
  2115.     IN LARGE_INTEGER DueTime,
  2116.     IN PKDPC Dpc
  2117.     );
  2118.  
  2119. typedef
  2120. BOOLEAN
  2121. (*PFNKSCANCELTIMER)(
  2122.     IN PVOID Context,
  2123.     IN PKTIMER Timer
  2124.     );
  2125.  
  2126. typedef
  2127. LONGLONG
  2128. (FASTCALL *PFNKSCORRELATEDTIME)(
  2129.     IN PVOID Context,
  2130.     OUT PLONGLONG SystemTime);
  2131.  
  2132. typedef PVOID   PKSDEFAULTCLOCK;
  2133.  
  2134. #define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\
  2135.     DEFINE_KSPROPERTY_ITEM(\
  2136.         KSPROPERTY_CLOCK_TIME,\
  2137.         (Handler),\
  2138.         sizeof(KSPROPERTY),\
  2139.         sizeof(LONGLONG),\
  2140.         NULL, NULL, 0, NULL, NULL, 0)
  2141.  
  2142. #define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\
  2143.     DEFINE_KSPROPERTY_ITEM(\
  2144.         KSPROPERTY_CLOCK_PHYSICALTIME,\
  2145.         (Handler),\
  2146.         sizeof(KSPROPERTY),\
  2147.         sizeof(LONGLONG),\
  2148.         NULL, NULL, 0, NULL, NULL, 0)
  2149.  
  2150. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\
  2151.     DEFINE_KSPROPERTY_ITEM(\
  2152.         KSPROPERTY_CLOCK_CORRELATEDTIME,\
  2153.         (Handler),\
  2154.         sizeof(KSPROPERTY),\
  2155.         sizeof(KSCORRELATED_TIME),\
  2156.         NULL, NULL, 0, NULL, NULL, 0)
  2157.  
  2158. #define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\
  2159.     DEFINE_KSPROPERTY_ITEM(\
  2160.         KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\
  2161.         (Handler),\
  2162.         sizeof(KSPROPERTY),\
  2163.         sizeof(KSCORRELATED_TIME),\
  2164.         NULL, NULL, 0, NULL, NULL, 0)
  2165.  
  2166. #define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\
  2167.     DEFINE_KSPROPERTY_ITEM(\
  2168.         KSPROPERTY_CLOCK_RESOLUTION,\
  2169.         (Handler),\
  2170.         sizeof(KSPROPERTY),\
  2171.         sizeof(KSRESOLUTION),\
  2172.         NULL, NULL, 0, NULL, NULL, 0)
  2173.  
  2174. #define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\
  2175.     DEFINE_KSPROPERTY_ITEM(\
  2176.         KSPROPERTY_CLOCK_STATE,\
  2177.         (Handler),\
  2178.         sizeof(KSPROPERTY),\
  2179.         sizeof(KSSTATE),\
  2180.         NULL, NULL, 0, NULL, NULL, 0)
  2181.  
  2182. #define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\
  2183.     DEFINE_KSPROPERTY_ITEM(\
  2184.         KSPROPERTY_CLOCK_FUNCTIONTABLE,\
  2185.         (Handler),\
  2186.         sizeof(KSPROPERTY),\
  2187.         sizeof(KSCLOCK_FUNCTIONTABLE),\
  2188.         NULL, NULL, 0, NULL, NULL, 0)
  2189.  
  2190. #define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\
  2191.     PropTime, PropPhysicalTime,\
  2192.     PropCorrelatedTime, PropCorrelatedPhysicalTime,\
  2193.     PropResolution, PropState, PropFunctionTable)\
  2194. DEFINE_KSPROPERTY_TABLE(ClockSet) {\
  2195.     DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\
  2196.     DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\
  2197.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\
  2198.     DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\
  2199.     DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\
  2200.     DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\
  2201.     DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable),\
  2202. }
  2203.  
  2204. #endif // defined(_NTDDK_)
  2205.  
  2206. #define STATIC_KSEVENTSETID_Clock \
  2207.     0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2208. DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
  2209. #define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
  2210.  
  2211. typedef enum {
  2212.     KSEVENT_CLOCK_INTERVAL_MARK,
  2213.     KSEVENT_CLOCK_POSITION_MARK
  2214. } KSEVENT_CLOCK_POSITION;
  2215.  
  2216. #define STATIC_KSEVENTSETID_Connection\
  2217.     0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
  2218. DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
  2219. #define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
  2220.  
  2221. typedef enum {
  2222.     KSEVENT_CONNECTION_POSITIONUPDATE,
  2223.     KSEVENT_CONNECTION_DATADISCONTINUITY,
  2224.     KSEVENT_CONNECTION_TIMEDISCONTINUITY,
  2225.     KSEVENT_CONNECTION_PRIORITY,
  2226.     KSEVENT_CONNECTION_ENDOFSTREAM
  2227. } KSEVENT_CONNECTION;
  2228.  
  2229. typedef struct {
  2230.     PVOID       Context;
  2231.     ULONG       Proportion;
  2232.     LONGLONG    DeltaTime;
  2233. } KSQUALITY, *PKSQUALITY;
  2234.  
  2235. typedef struct {
  2236.     PVOID       Context;
  2237.     ULONG       Status;
  2238. } KSERROR, *PKSERROR;
  2239.  
  2240. typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE;
  2241.  
  2242. #define STATIC_KSDEGRADESETID_Standard\
  2243.     0x9F564180L, 0x704C, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
  2244. DEFINE_GUIDSTRUCT("9F564180-704C-11D0-A5D6-28DB04C10000", KSDEGRADESETID_Standard);
  2245. #define KSDEGRADESETID_Standard DEFINE_GUIDNAMED(KSDEGRADESETID_Standard)
  2246.  
  2247. typedef enum {
  2248.     KSDEGRADE_STANDARD_SAMPLE,
  2249.     KSDEGRADE_STANDARD_QUALITY,
  2250.     KSDEGRADE_STANDARD_COMPUTATION,
  2251.     KSDEGRADE_STANDARD_SKIP
  2252. } KSDEGRADE_STANDARD;
  2253.  
  2254. #if defined(_NTDDK_)
  2255.  
  2256. #define KSPROBE_STREAMREAD      0x00000000
  2257. #define KSPROBE_STREAMWRITE     0x00000001
  2258. #define KSPROBE_ALLOCATEMDL     0x00000010
  2259. #define KSPROBE_PROBEANDLOCK    0x00000020
  2260. #define KSPROBE_SYSTEMADDRESS   0x00000040
  2261. #define KSPROBE_MODIFY          0x00000200
  2262. #define KSPROBE_STREAMWRITEMODIFY (KSPROBE_MODIFY | KSPROBE_STREAMWRITE)
  2263. #define KSPROBE_ALLOWFORMATCHANGE   0x00000080
  2264.  
  2265. #define KSSTREAM_READ           KSPROBE_STREAMREAD
  2266. #define KSSTREAM_WRITE          KSPROBE_STREAMWRITE
  2267. #define KSSTREAM_PAGED_DATA     0x00000000
  2268. #define KSSTREAM_NONPAGED_DATA  0x00000100
  2269. #define KSSTREAM_SYNCHRONOUS    0x00001000
  2270. #define KSSTREAM_FAILUREEXCEPTION 0x00002000
  2271.  
  2272. typedef
  2273. NTSTATUS
  2274. (*PFNKSCONTEXT_DISPATCH)(
  2275.     IN PVOID Context,
  2276.     IN PIRP Irp
  2277.     );
  2278.  
  2279. typedef
  2280. NTSTATUS
  2281. (*PFNKSHANDLER)(
  2282.     IN PIRP Irp,
  2283.     IN PKSIDENTIFIER Request,
  2284.     IN OUT PVOID Data
  2285.     );
  2286.  
  2287. typedef
  2288. BOOLEAN
  2289. (*PFNKSFASTHANDLER)(
  2290.     IN PFILE_OBJECT FileObject,
  2291.     IN PKSIDENTIFIER Request,
  2292.     IN ULONG RequestLength,
  2293.     IN OUT PVOID Data,
  2294.     IN ULONG DataLength,
  2295.     OUT PIO_STATUS_BLOCK IoStatus
  2296.     );
  2297.  
  2298. typedef
  2299. NTSTATUS
  2300. (*PFNKSALLOCATOR)(
  2301.     IN PIRP Irp,
  2302.     IN ULONG BufferSize,
  2303.     IN BOOLEAN InputOperation
  2304.     );
  2305.  
  2306. typedef struct {
  2307.     KSPROPERTY_MEMBERSHEADER    MembersHeader;
  2308.     const VOID*                 Members;
  2309. } KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST;
  2310.  
  2311. typedef struct {
  2312.     KSIDENTIFIER                    PropTypeSet;
  2313.     ULONG                           MembersListCount;
  2314.     const KSPROPERTY_MEMBERSLIST*   MembersList;
  2315. } KSPROPERTY_VALUES, *PKSPROPERTY_VALUES;
  2316.  
  2317. #define DEFINE_KSPROPERTY_TABLE(tablename)\
  2318.     const KSPROPERTY_ITEM tablename[] =
  2319.  
  2320. #define DEFINE_KSPROPERTY_ITEM(PropertyId, GetHandler,\
  2321.                                MinProperty,\
  2322.                                MinData,\
  2323.                                SetHandler,\
  2324.                                Values, RelationsCount, Relations, SupportHandler,\
  2325.                                SerializedSize)\
  2326. {\
  2327.     PropertyId, (PFNKSHANDLER)GetHandler, MinProperty, MinData,\
  2328.     (PFNKSHANDLER)SetHandler,\
  2329.     (PKSPROPERTY_VALUES)Values, RelationsCount, (PKSPROPERTY)Relations,\
  2330.     (PFNKSHANDLER)SupportHandler, (ULONG)SerializedSize\
  2331. }
  2332.  
  2333. typedef struct {
  2334.     ULONG                   PropertyId;
  2335.     union {
  2336.         PFNKSHANDLER            GetPropertyHandler;
  2337.         BOOLEAN                 GetSupported;
  2338.     };
  2339.     ULONG                   MinProperty;
  2340.     ULONG                   MinData;
  2341.     union {
  2342.         PFNKSHANDLER            SetPropertyHandler;
  2343.         BOOLEAN                 SetSupported;
  2344.     };
  2345.     const KSPROPERTY_VALUES*Values;
  2346.     ULONG                   RelationsCount;
  2347.     const KSPROPERTY*       Relations;
  2348.     PFNKSHANDLER            SupportHandler;
  2349.     ULONG                   SerializedSize;
  2350. } KSPROPERTY_ITEM, *PKSPROPERTY_ITEM;
  2351.  
  2352. #define DEFINE_KSFASTPROPERTY_ITEM(PropertyId, GetHandler, SetHandler)\
  2353. {\
  2354.     PropertyId, (PFNKSFASTHANDLER)GetHandler, (PFNKSFASTHANDLER)SetHandler, 0\
  2355. }
  2356.  
  2357. typedef struct {
  2358.     ULONG                       PropertyId;
  2359.     union {
  2360.         PFNKSFASTHANDLER            GetPropertyHandler;
  2361.         BOOLEAN                     GetSupported;
  2362.     };
  2363.     union {
  2364.         PFNKSFASTHANDLER            SetPropertyHandler;
  2365.         BOOLEAN                     SetSupported;
  2366.     };
  2367.     ULONG                       Reserved;
  2368. } KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM;
  2369.  
  2370. #define DEFINE_KSPROPERTY_SET(Set,\
  2371.                               PropertiesCount,\
  2372.                               PropertyItem,\
  2373.                               FastIoCount,\
  2374.                               FastIoTable)\
  2375. {\
  2376.     Set,\
  2377.     PropertiesCount,\
  2378.     PropertyItem,\
  2379.     FastIoCount,\
  2380.     FastIoTable\
  2381. }
  2382.  
  2383. #define DEFINE_KSPROPERTY_SET_TABLE(tablename)\
  2384.     const KSPROPERTY_SET tablename[] =
  2385.  
  2386. typedef struct {
  2387.     const GUID*                 Set;
  2388.     ULONG                       PropertiesCount;
  2389.     const KSPROPERTY_ITEM*      PropertyItem;
  2390.     ULONG                       FastIoCount;
  2391.     const KSFASTPROPERTY_ITEM*  FastIoTable;
  2392. } KSPROPERTY_SET, *PKSPROPERTY_SET;
  2393.  
  2394. #define DEFINE_KSMETHOD_TABLE(tablename)\
  2395.     const KSMETHOD_ITEM tablename[] =
  2396.  
  2397. #define DEFINE_KSMETHOD_ITEM(MethodId, Flags,\
  2398.                              MethodHandler,\
  2399.                              MinMethod, MinData, SupportHandler)\
  2400. {\
  2401.     MethodId, (PFNKSHANDLER)MethodHandler, MinMethod, MinData,\
  2402.     SupportHandler, Flags\
  2403. }
  2404.  
  2405. typedef struct {
  2406.     ULONG                   MethodId;
  2407.     union {
  2408.         PFNKSHANDLER            MethodHandler;
  2409.         BOOLEAN                 MethodSupported;
  2410.     };
  2411.     ULONG                   MinMethod;
  2412.     ULONG                   MinData;
  2413.     PFNKSHANDLER            SupportHandler;
  2414.     ULONG                   Flags;
  2415. } KSMETHOD_ITEM, *PKSMETHOD_ITEM;
  2416.  
  2417. #define DEFINE_KSFASTMETHOD_ITEM(MethodId, MethodHandler)\
  2418. {\
  2419.     MethodId, (PFNKSFASTHANDLER)MethodHandler\
  2420. }
  2421.  
  2422. typedef struct {
  2423.     ULONG                   MethodId;
  2424.     union {
  2425.         PFNKSFASTHANDLER        MethodHandler;
  2426.         BOOLEAN                 MethodSupported;
  2427.     };
  2428. } KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM;
  2429.  
  2430. #define DEFINE_KSMETHOD_SET(Set,\
  2431.                             MethodsCount,\
  2432.                             MethodItem,\
  2433.                             FastIoCount,\
  2434.                             FastIoTable)\
  2435. {\
  2436.     Set,\
  2437.     MethodsCount,\
  2438.     MethodItem,\
  2439.     FastIoCount,\
  2440.     FastIoTable\
  2441. }
  2442.  
  2443. #define DEFINE_KSMETHOD_SET_TABLE(tablename)\
  2444.     const KSMETHOD_SET tablename[] =
  2445.  
  2446. typedef struct {
  2447.     const GUID*             Set;
  2448.     ULONG                   MethodsCount;
  2449.     const KSMETHOD_ITEM*    MethodItem;
  2450.     ULONG                   FastIoCount;
  2451.     const KSFASTMETHOD_ITEM*FastIoTable;
  2452. } KSMETHOD_SET, *PKSMETHOD_SET;
  2453.  
  2454. typedef struct _KSEVENT_ENTRY
  2455. KSEVENT_ENTRY, *PKSEVENT_ENTRY;
  2456.  
  2457. typedef
  2458. NTSTATUS
  2459. (*PFNKSADDEVENT)(
  2460.     IN PIRP Irp,
  2461.     IN PKSEVENTDATA EventData,
  2462.     IN struct _KSEVENT_ENTRY* EventEntry
  2463.     );
  2464.  
  2465. typedef
  2466. VOID
  2467. (*PFNKSREMOVEEVENT)(
  2468.     IN PFILE_OBJECT FileObject,
  2469.     IN struct _KSEVENT_ENTRY* EventEntry
  2470.     );
  2471.     
  2472. #define DEFINE_KSEVENT_TABLE(tablename)\
  2473.     const KSEVENT_ITEM tablename[] =
  2474.  
  2475. #define DEFINE_KSEVENT_ITEM(EventId, DataInput, ExtraEntryData,\
  2476.                             AddHandler, RemoveHandler, SupportHandler)\
  2477. {\
  2478.     EventId,\
  2479.     DataInput,\
  2480.     ExtraEntryData,\
  2481.     AddHandler,\
  2482.     RemoveHandler,\
  2483.     SupportHandler\
  2484. }
  2485.  
  2486. typedef struct {
  2487.     ULONG               EventId;
  2488.     ULONG               DataInput;
  2489.     ULONG               ExtraEntryData;
  2490.     PFNKSADDEVENT       AddHandler;
  2491.     PFNKSREMOVEEVENT    RemoveHandler;
  2492.     PFNKSHANDLER        SupportHandler;
  2493. } KSEVENT_ITEM, *PKSEVENT_ITEM;
  2494.  
  2495. #define DEFINE_KSEVENT_SET(Set,\
  2496.                            EventsCount,\
  2497.                            EventItem)\
  2498. {\
  2499.     Set, EventsCount, EventItem\
  2500. }
  2501.  
  2502. #define DEFINE_KSEVENT_SET_TABLE(tablename)\
  2503.     const KSEVENT_SET tablename[] =
  2504.  
  2505. typedef struct {
  2506.     const GUID*         Set;
  2507.     ULONG               EventsCount;
  2508.     const KSEVENT_ITEM* EventItem;
  2509. } KSEVENT_SET, *PKSEVENT_SET;
  2510.  
  2511. typedef struct {
  2512.     KDPC            Dpc;
  2513.     ULONG           ReferenceCount;
  2514.     KSPIN_LOCK      AccessLock;
  2515. } KSDPC_ITEM, *PKSDPC_ITEM;
  2516.  
  2517. typedef struct {
  2518.     KSDPC_ITEM          DpcItem;
  2519.     LIST_ENTRY          BufferList;
  2520. } KSBUFFER_ITEM, *PKSBUFFER_ITEM;
  2521.  
  2522. #define KSEVENT_ENTRY_DELETED   1
  2523. #define KSEVENT_ENTRY_ONESHOT   2
  2524. #define KSEVENT_ENTRY_BUFFERED  4
  2525.  
  2526. struct _KSEVENT_ENTRY {
  2527.     LIST_ENTRY      ListEntry;
  2528.     PVOID           Object;
  2529.     union {
  2530.         PKSDPC_ITEM         DpcItem;
  2531.         PKSBUFFER_ITEM      BufferItem;
  2532.     };
  2533.     PKSEVENTDATA        EventData;
  2534.     ULONG               NotificationType;
  2535.     const KSEVENT_SET*  EventSet;
  2536.     const KSEVENT_ITEM* EventItem;
  2537.     PFILE_OBJECT        FileObject;
  2538.     ULONG               SemaphoreAdjustment;
  2539.     ULONG               Reserved;
  2540.     ULONG               Flags;
  2541. };
  2542.  
  2543. typedef enum {
  2544.     KSEVENTS_NONE,
  2545.     KSEVENTS_SPINLOCK,
  2546.     KSEVENTS_MUTEX,
  2547.     KSEVENTS_FMUTEX,
  2548.     KSEVENTS_FMUTEXUNSAFE,
  2549.     KSEVENTS_INTERRUPT,
  2550.     KSEVENTS_ERESOURCE
  2551. } KSEVENTS_LOCKTYPE;
  2552.  
  2553. #define KSDISPATCH_FASTIO       0x80000000
  2554.  
  2555. typedef struct {
  2556.     PDRIVER_DISPATCH        Create;
  2557.     PVOID                   Context;
  2558.     UNICODE_STRING          ObjectClass;
  2559.     PSECURITY_DESCRIPTOR    SecurityDescriptor;
  2560.     ULONG                   Flags;
  2561. } KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM;
  2562.  
  2563. typedef
  2564. VOID
  2565. (*PFNKSITEMFREECALLBACK)(
  2566.     IN PKSOBJECT_CREATE_ITEM CreateItem
  2567.     );
  2568.  
  2569. #define KSCREATE_ITEM_SECURITYCHANGED       0x00000001
  2570. #define KSCREATE_ITEM_WILDCARD              0x00000002
  2571. #define KSCREATE_ITEM_NOPARAMETERS          0x00000004
  2572. #define KSCREATE_ITEM_FREEONSTOP            0x00000008
  2573.  
  2574. #define DEFINE_KSCREATE_DISPATCH_TABLE( tablename )\
  2575.     KSOBJECT_CREATE_ITEM tablename[] =
  2576.  
  2577. #define DEFINE_KSCREATE_ITEM(DispatchCreate, TypeName, Context)\
  2578. {\
  2579.     (DispatchCreate),\
  2580.     (PVOID)(Context),\
  2581.     {\
  2582.         sizeof(TypeName) - sizeof(UNICODE_NULL),\
  2583.         sizeof(TypeName),\
  2584.         (PWCHAR)(TypeName)\
  2585.     },\
  2586.     NULL, 0\
  2587. }
  2588.  
  2589. #define DEFINE_KSCREATE_ITEMEX(DispatchCreate, TypeName, Context, Flags)\
  2590. {\
  2591.     (DispatchCreate),\
  2592.     (PVOID)(Context),\
  2593.     {\
  2594.         sizeof(TypeName) - sizeof(UNICODE_NULL),\
  2595.         sizeof(TypeName),\
  2596.         (PWCHAR)(TypeName)\
  2597.     },\
  2598.     NULL, (Flags)\
  2599. }
  2600.  
  2601. #define DEFINE_KSCREATE_ITEMNULL( DispatchCreate, Context )\
  2602. {\
  2603.     DispatchCreate,\
  2604.     Context,\
  2605.     {\
  2606.         0,\
  2607.         0,\
  2608.         NULL,\
  2609.     },\
  2610.     NULL, 0\
  2611. }
  2612.  
  2613. typedef struct {
  2614.     ULONG                    CreateItemsCount;
  2615.     PKSOBJECT_CREATE_ITEM    CreateItemsList;
  2616. } KSOBJECT_CREATE, *PKSOBJECT_CREATE;
  2617.  
  2618. typedef struct {
  2619.     PDRIVER_DISPATCH        DeviceIoControl;
  2620.     PDRIVER_DISPATCH        Read;
  2621.     PDRIVER_DISPATCH        Write;
  2622.     PDRIVER_DISPATCH        Flush;
  2623.     PDRIVER_DISPATCH        Close;
  2624.     PDRIVER_DISPATCH        QuerySecurity;
  2625.     PDRIVER_DISPATCH        SetSecurity;
  2626.     PFAST_IO_DEVICE_CONTROL FastDeviceIoControl;
  2627.     PFAST_IO_READ           FastRead;
  2628.     PFAST_IO_WRITE          FastWrite;
  2629. } KSDISPATCH_TABLE, *PKSDISPATCH_TABLE;
  2630.  
  2631. #define DEFINE_KSDISPATCH_TABLE( tablename, DeviceIoControl, Read, Write,\
  2632.                                  Flush, Close, QuerySecurity, SetSecurity,\
  2633.                                  FastDeviceIoControl, FastRead, FastWrite  )\
  2634.     const KSDISPATCH_TABLE tablename = \
  2635.     {\
  2636.         DeviceIoControl,        \
  2637.         Read,                   \
  2638.         Write,                  \
  2639.         Flush,                  \
  2640.         Close,                  \
  2641.         QuerySecurity,          \
  2642.         SetSecurity,            \
  2643.         FastDeviceIoControl,    \
  2644.         FastRead,               \
  2645.         FastWrite,              \
  2646.     }
  2647.  
  2648. #define KSCREATE_ITEM_IRP_STORAGE(Irp)      (*(PKSOBJECT_CREATE_ITEM*)&(Irp)->Tail.Overlay.DriverContext[0])
  2649. #define KSEVENT_SET_IRP_STORAGE(Irp)        (*(const KSEVENT_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2650. #define KSEVENT_ITEM_IRP_STORAGE(Irp)       (*(const KSEVENT_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2651. #define KSEVENT_ENTRY_IRP_STORAGE(Irp)      (*(PKSEVENT_ENTRY*)&(Irp)->Tail.Overlay.DriverContext[0])
  2652. #define KSMETHOD_SET_IRP_STORAGE(Irp)       (*(const KSMETHOD_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2653. #define KSMETHOD_ITEM_IRP_STORAGE(Irp)      (*(const KSMETHOD_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2654. #define KSMETHOD_TYPE_IRP_STORAGE(Irp)      (*(ULONG_PTR*)(&(Irp)->Tail.Overlay.DriverContext[2]))
  2655. #define KSQUEUE_SPINLOCK_IRP_STORAGE(Irp)   (*(PKSPIN_LOCK*)&(Irp)->Tail.Overlay.DriverContext[1])
  2656. #define KSPROPERTY_SET_IRP_STORAGE(Irp)     (*(const KSPROPERTY_SET**)&(Irp)->Tail.Overlay.DriverContext[0])
  2657. #define KSPROPERTY_ITEM_IRP_STORAGE(Irp)    (*(const KSPROPERTY_ITEM**)&(Irp)->Tail.Overlay.DriverContext[3])
  2658. #define KSPROPERTY_ATTRIBUTES_IRP_STORAGE(Irp) (*(PKSATTRIBUTE_LIST*)&(Irp)->Tail.Overlay.DriverContext[2])
  2659.  
  2660. typedef PVOID   KSDEVICE_HEADER, KSOBJECT_HEADER;
  2661.  
  2662. typedef enum {
  2663.     KsInvokeOnSuccess = 1,
  2664.     KsInvokeOnError = 2,
  2665.     KsInvokeOnCancel = 4
  2666. } KSCOMPLETION_INVOCATION;
  2667.  
  2668. typedef enum {
  2669.     KsListEntryTail,
  2670.     KsListEntryHead
  2671. } KSLIST_ENTRY_LOCATION;
  2672.  
  2673. typedef enum {
  2674.     KsAcquireOnly,
  2675.     KsAcquireAndRemove,
  2676.     KsAcquireOnlySingleItem,
  2677.     KsAcquireAndRemoveOnlySingleItem
  2678. } KSIRP_REMOVAL_OPERATION;
  2679.  
  2680. typedef enum {
  2681.     KsStackCopyToNewLocation,
  2682.     KsStackReuseCurrentLocation,
  2683.     KsStackUseNewLocation
  2684. } KSSTACK_USE;
  2685.  
  2686. typedef enum {
  2687.     KSTARGET_STATE_DISABLED,
  2688.     KSTARGET_STATE_ENABLED
  2689. } KSTARGET_STATE;
  2690.  
  2691. typedef
  2692. NTSTATUS
  2693. (*PFNKSIRPLISTCALLBACK)(
  2694.     IN PIRP Irp,
  2695.     IN PVOID Context
  2696.     );
  2697.  
  2698. typedef 
  2699. VOID 
  2700. (*PFNREFERENCEDEVICEOBJECT)( 
  2701.     IN PVOID Context
  2702.     );
  2703.     
  2704. typedef 
  2705. VOID 
  2706. (*PFNDEREFERENCEDEVICEOBJECT)( 
  2707.     IN PVOID Context
  2708.     );
  2709.     
  2710. typedef
  2711. NTSTATUS
  2712. (*PFNQUERYREFERENCESTRING)( 
  2713.     IN PVOID Context,
  2714.     IN OUT PWCHAR *String
  2715.     );
  2716.  
  2717. #define BUS_INTERFACE_REFERENCE_VERSION    0x100
  2718.     
  2719. typedef struct {
  2720.     //
  2721.     // Standard interface header
  2722.     //
  2723.     
  2724.     INTERFACE                   Interface;
  2725.     
  2726.     //
  2727.     // Standard bus interfaces
  2728.     //
  2729.     
  2730.     PFNREFERENCEDEVICEOBJECT    ReferenceDeviceObject;
  2731.     PFNDEREFERENCEDEVICEOBJECT  DereferenceDeviceObject;
  2732.     PFNQUERYREFERENCESTRING     QueryReferenceString;
  2733.     
  2734. } BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
  2735.  
  2736. #define STATIC_REFERENCE_BUS_INTERFACE STATIC_KSMEDIUMSETID_Standard
  2737. #define REFERENCE_BUS_INTERFACE KSMEDIUMSETID_Standard
  2738.  
  2739. typedef
  2740. NTSTATUS
  2741. (*PFNQUERYMEDIUMSLIST)( 
  2742.     IN PVOID Context,
  2743.     OUT ULONG* MediumsCount,
  2744.     OUT PKSPIN_MEDIUM* MediumList
  2745.     );
  2746.  
  2747. typedef struct {
  2748.     //
  2749.     // Standard interface header
  2750.     //
  2751.     
  2752.     INTERFACE                   Interface;
  2753.     
  2754.     //
  2755.     // Interface definition
  2756.     //
  2757.     
  2758.     PFNQUERYMEDIUMSLIST         QueryMediumsList;
  2759.     
  2760. } BUS_INTERFACE_MEDIUMS, *PBUS_INTERFACE_MEDIUMS;
  2761.  
  2762. #define STATIC_GUID_BUS_INTERFACE_MEDIUMS \
  2763.     0x4EC35C3EL, 0x201B, 0x11D2, 0x87, 0x45, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  2764. DEFINE_GUIDSTRUCT("4EC35C3E-201B-11D2-8745-00A0C9223196", GUID_BUS_INTERFACE_MEDIUMS);
  2765. #define GUID_BUS_INTERFACE_MEDIUMS DEFINE_GUIDNAMED(GUID_BUS_INTERFACE_MEDIUMS)
  2766.  
  2767. #endif // defined(_NTDDK_)
  2768.  
  2769. #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  2770. #include <pshpack1.h>
  2771. #endif
  2772.  
  2773. typedef struct {
  2774.     GUID            PropertySet;
  2775.     ULONG           Count;
  2776. } KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR;
  2777.  
  2778. #if !defined( PACK_PRAGMAS_NOT_SUPPORTED )
  2779. #include <poppack.h>
  2780. #endif
  2781.  
  2782. typedef struct {
  2783.     KSIDENTIFIER    PropTypeSet;
  2784.     ULONG           Id;
  2785.     ULONG           PropertyLength;
  2786. } KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL;
  2787.  
  2788. #if defined(_NTDDK_)
  2789.  
  2790. #define IOCTL_KS_HANDSHAKE             CTL_CODE(FILE_DEVICE_KS, 0x007, METHOD_NEITHER, FILE_ANY_ACCESS)
  2791.  
  2792. typedef struct {
  2793.     GUID ProtocolId;
  2794.     PVOID Argument1;
  2795.     PVOID Argument2;
  2796. } KSHANDSHAKE, *PKSHANDSHAKE;
  2797.  
  2798. typedef struct _KSGATE
  2799. KSGATE, *PKSGATE;
  2800.  
  2801. struct _KSGATE {
  2802.     LONG Count;
  2803.     PKSGATE NextGate;
  2804. };
  2805.  
  2806. #ifndef _NTOS_
  2807.  
  2808. void __inline
  2809. KsGateTurnInputOn(
  2810.     IN PKSGATE Gate OPTIONAL
  2811.     )
  2812. {
  2813.     while (Gate && (InterlockedIncrement(&Gate->Count) == 1)) {
  2814.         Gate = Gate->NextGate;
  2815.     }
  2816. }
  2817.  
  2818. void __inline
  2819. KsGateTurnInputOff(
  2820.     IN PKSGATE Gate OPTIONAL
  2821.     )
  2822. {
  2823.     while (Gate && (InterlockedDecrement(&Gate->Count) == 0)) {
  2824.         Gate = Gate->NextGate;
  2825.     }
  2826. }
  2827.  
  2828. BOOLEAN __inline
  2829. KsGateGetStateUnsafe(
  2830.     IN PKSGATE Gate
  2831.     )
  2832. {
  2833.     ASSERT(Gate);
  2834.     return((BOOLEAN)(Gate->Count > 0));
  2835. }
  2836.  
  2837. BOOLEAN __inline
  2838. KsGateCaptureThreshold(
  2839.     IN PKSGATE Gate
  2840.     )
  2841. {
  2842.     BOOLEAN captured;
  2843.  
  2844.     ASSERT(Gate);
  2845.  
  2846.     captured = (BOOLEAN)(InterlockedCompareExchange(&Gate->Count,0,1) == 1);
  2847.     
  2848.     //
  2849.     // If we made a transition, it must be propagated.
  2850.     //
  2851.     if (captured) {
  2852.         KsGateTurnInputOff(Gate->NextGate);
  2853.     }
  2854.  
  2855.     //
  2856.     // We return whatever the state was prior to the compare/exchange.  If
  2857.     // the state was on, the state is now off.
  2858.     //
  2859.     return captured;
  2860. }
  2861.  
  2862. void __inline
  2863. KsGateInitialize(
  2864.     IN PKSGATE Gate,
  2865.     IN LONG InitialCount,
  2866.     IN PKSGATE NextGate OPTIONAL,
  2867.     IN BOOLEAN StateToPropagate // IN BOOLEAN NextGateIsAnOrGate
  2868.     )
  2869. {
  2870.     ASSERT(Gate);
  2871.     Gate->Count = InitialCount;
  2872.     Gate->NextGate = NextGate;
  2873.  
  2874.     if (NextGate) {
  2875.         if (InitialCount > 0) {
  2876.             if (StateToPropagate) {
  2877.                 KsGateTurnInputOn(NextGate);
  2878.             }
  2879.         } else {
  2880.             if (! StateToPropagate) {
  2881.                 KsGateTurnInputOff(NextGate);
  2882.             }
  2883.         }
  2884.     }
  2885. }
  2886.  
  2887. void __inline
  2888. KsGateInitializeAnd(
  2889.     IN PKSGATE AndGate,
  2890.     IN PKSGATE NextOrGate OPTIONAL
  2891.     )
  2892. {
  2893.     KsGateInitialize(AndGate,1,NextOrGate,TRUE);
  2894. }
  2895.  
  2896. void __inline
  2897. KsGateInitializeOr(
  2898.     IN PKSGATE OrGate,
  2899.     IN PKSGATE NextAndGate OPTIONAL
  2900.     )
  2901. {
  2902.     KsGateInitialize(OrGate,0,NextAndGate,FALSE);
  2903. }
  2904.  
  2905. void __inline KsGateAddOnInputToAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); }
  2906. void __inline KsGateAddOffInputToAnd(IN PKSGATE AndGate) { KsGateTurnInputOff(AndGate); }
  2907. void __inline KsGateRemoveOnInputFromAnd(IN PKSGATE AndGate) { UNREFERENCED_PARAMETER (AndGate); }
  2908. void __inline KsGateRemoveOffInputFromAnd(IN PKSGATE AndGate) { KsGateTurnInputOn(AndGate); }
  2909.  
  2910. void __inline KsGateAddOnInputToOr(IN PKSGATE OrGate) { KsGateTurnInputOn(OrGate); }
  2911. void __inline KsGateAddOffInputToOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); }
  2912. void __inline KsGateRemoveOnInputFromOr(IN PKSGATE OrGate) { KsGateTurnInputOff(OrGate); }
  2913. void __inline KsGateRemoveOffInputFromOr(IN PKSGATE OrGate) { UNREFERENCED_PARAMETER (OrGate); }
  2914.  
  2915. void __inline
  2916. KsGateTerminateAnd(
  2917.     IN PKSGATE AndGate
  2918.     )
  2919. {
  2920.     ASSERT(AndGate);
  2921.     if (KsGateGetStateUnsafe(AndGate)) {
  2922.         KsGateRemoveOnInputFromOr(AndGate->NextGate);
  2923.     } else {
  2924.         KsGateRemoveOffInputFromOr(AndGate->NextGate);
  2925.     }
  2926. }
  2927.  
  2928. void __inline
  2929. KsGateTerminateOr(
  2930.     IN PKSGATE OrGate
  2931.     )
  2932. {
  2933.     ASSERT(OrGate);
  2934.     if (KsGateGetStateUnsafe(OrGate)) {
  2935.         KsGateRemoveOnInputFromAnd(OrGate->NextGate);
  2936.     } else {
  2937.         KsGateRemoveOffInputFromAnd(OrGate->NextGate);
  2938.     }
  2939. }
  2940.  
  2941. #endif // !_NTOS_
  2942.  
  2943. typedef PVOID KSOBJECT_BAG;
  2944.  
  2945. typedef
  2946. BOOLEAN
  2947. (*PFNKSGENERATEEVENTCALLBACK)(
  2948.     IN PVOID Context,
  2949.     IN PKSEVENT_ENTRY EventEntry
  2950.     );
  2951.  
  2952. typedef
  2953. NTSTATUS
  2954. (*PFNKSDEVICECREATE)(
  2955.     IN PKSDEVICE Device
  2956.     );
  2957. typedef
  2958. NTSTATUS
  2959. (*PFNKSDEVICEPNPSTART)(
  2960.     IN PKSDEVICE Device,
  2961.     IN PIRP Irp,
  2962.     IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
  2963.     IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL
  2964.     );
  2965. typedef
  2966. NTSTATUS
  2967. (*PFNKSDEVICE)(
  2968.     IN PKSDEVICE Device
  2969.     );
  2970. typedef
  2971. NTSTATUS
  2972. (*PFNKSDEVICEIRP)(
  2973.     IN PKSDEVICE Device,
  2974.     IN PIRP Irp
  2975.     );
  2976. typedef
  2977. void
  2978. (*PFNKSDEVICEIRPVOID)(
  2979.     IN PKSDEVICE Device,
  2980.     IN PIRP Irp
  2981.     );
  2982. typedef
  2983. NTSTATUS
  2984. (*PFNKSDEVICEQUERYCAPABILITIES)(
  2985.     IN PKSDEVICE Device,
  2986.     IN PIRP Irp,
  2987.     IN OUT PDEVICE_CAPABILITIES Capabilities
  2988.     );
  2989. typedef
  2990. NTSTATUS
  2991. (*PFNKSDEVICEQUERYPOWER)(
  2992.     IN PKSDEVICE Device,
  2993.     IN PIRP Irp,
  2994.     IN DEVICE_POWER_STATE DeviceTo,
  2995.     IN DEVICE_POWER_STATE DeviceFrom,
  2996.     IN SYSTEM_POWER_STATE SystemTo,
  2997.     IN SYSTEM_POWER_STATE SystemFrom,
  2998.     IN POWER_ACTION Action
  2999.     );
  3000. typedef
  3001. void
  3002. (*PFNKSDEVICESETPOWER)(
  3003.     IN PKSDEVICE Device,
  3004.     IN PIRP Irp,
  3005.     IN DEVICE_POWER_STATE To,
  3006.     IN DEVICE_POWER_STATE From
  3007.     );
  3008. typedef
  3009. NTSTATUS
  3010. (*PFNKSFILTERFACTORYVOID)(
  3011.     IN PKSFILTERFACTORY FilterFactory
  3012.     );
  3013. typedef
  3014. void
  3015. (*PFNKSFILTERFACTORYPOWER)(
  3016.     IN PKSFILTERFACTORY FilterFactory,
  3017.     IN DEVICE_POWER_STATE State
  3018.     );
  3019. typedef
  3020. NTSTATUS
  3021. (*PFNKSFILTERIRP)(
  3022.     IN PKSFILTER Filter,
  3023.     IN PIRP Irp
  3024.     );
  3025. typedef
  3026. NTSTATUS
  3027. (*PFNKSFILTERPROCESS)(
  3028.     IN PKSFILTER Filter,
  3029.     IN PKSPROCESSPIN_INDEXENTRY Index
  3030.     );
  3031. typedef
  3032. NTSTATUS
  3033. (*PFNKSFILTERVOID)(
  3034.     IN PKSFILTER Filter
  3035.     );
  3036. typedef
  3037. void
  3038. (*PFNKSFILTERPOWER)(
  3039.     IN PKSFILTER Filter,
  3040.     IN DEVICE_POWER_STATE State
  3041.     );
  3042. typedef
  3043. NTSTATUS
  3044. (*PFNKSPINIRP)(
  3045.     IN PKSPIN Pin,
  3046.     IN PIRP Irp
  3047.     );
  3048. typedef
  3049. NTSTATUS
  3050. (*PFNKSPINSETDEVICESTATE)(
  3051.     IN PKSPIN Pin,
  3052.     IN KSSTATE ToState,
  3053.     IN KSSTATE FromState
  3054.     );
  3055. typedef
  3056. NTSTATUS
  3057. (*PFNKSPINSETDATAFORMAT)(
  3058.     IN PKSPIN Pin,
  3059.     IN PKSDATAFORMAT OldFormat OPTIONAL,
  3060.     IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL,
  3061.     IN const KSDATARANGE* DataRange,
  3062.     IN const KSATTRIBUTE_LIST* AttributeRange OPTIONAL
  3063.     );
  3064. typedef
  3065. NTSTATUS
  3066. (*PFNKSPINHANDSHAKE)(
  3067.     IN PKSPIN Pin,
  3068.     IN PKSHANDSHAKE In,
  3069.     IN PKSHANDSHAKE Out
  3070.     );
  3071. typedef
  3072. NTSTATUS
  3073. (*PFNKSPIN)(
  3074.     IN PKSPIN Pin
  3075.     );
  3076. typedef
  3077. void
  3078. (*PFNKSPINVOID)(
  3079.     IN PKSPIN Pin
  3080.     );
  3081. typedef
  3082. void
  3083. (*PFNKSPINPOWER)(
  3084.     IN PKSPIN Pin,
  3085.     IN DEVICE_POWER_STATE State
  3086.     );
  3087. typedef
  3088. BOOLEAN
  3089. (*PFNKSPINSETTIMER)(
  3090.     IN PKSPIN Pin,
  3091.     IN PKTIMER Timer,
  3092.     IN LARGE_INTEGER DueTime,
  3093.     IN PKDPC Dpc
  3094.     );
  3095. typedef
  3096. BOOLEAN
  3097. (*PFNKSPINCANCELTIMER)(
  3098.     IN PKSPIN Pin,
  3099.     IN PKTIMER Timer
  3100.     );
  3101. typedef
  3102. LONGLONG
  3103. (FASTCALL *PFNKSPINCORRELATEDTIME)(
  3104.     IN PKSPIN Pin,
  3105.     OUT PLONGLONG SystemTime
  3106.     );
  3107. typedef
  3108. void
  3109. (*PFNKSPINRESOLUTION)(
  3110.     IN PKSPIN Pin,
  3111.     OUT PKSRESOLUTION Resolution
  3112.     );
  3113. typedef
  3114. NTSTATUS
  3115. (*PFNKSPININITIALIZEALLOCATOR)(
  3116.     IN PKSPIN Pin,
  3117.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  3118.     OUT PVOID* Context
  3119.     );
  3120. typedef
  3121. void
  3122. (*PFNKSSTREAMPOINTER)(
  3123.     IN PKSSTREAM_POINTER StreamPointer
  3124.     );
  3125.  
  3126. typedef struct KSAUTOMATION_TABLE_ 
  3127. KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
  3128. struct KSAUTOMATION_TABLE_ {
  3129.     ULONG PropertySetsCount;
  3130.     ULONG PropertyItemSize;
  3131.     const KSPROPERTY_SET* PropertySets;
  3132.     ULONG MethodSetsCount;
  3133.     ULONG MethodItemSize;
  3134.     const KSMETHOD_SET* MethodSets;
  3135.     ULONG EventSetsCount;
  3136.     ULONG EventItemSize;
  3137.     const KSEVENT_SET* EventSets;
  3138. #if !defined(_WIN64)
  3139.     PVOID Alignment;
  3140. #endif // !defined(_WIN64)
  3141. };
  3142.  
  3143. #define DEFINE_KSAUTOMATION_TABLE(table)\
  3144.     const KSAUTOMATION_TABLE table =
  3145.  
  3146. #define DEFINE_KSAUTOMATION_PROPERTIES(table)\
  3147.     SIZEOF_ARRAY(table),\
  3148.     sizeof(KSPROPERTY_ITEM),\
  3149.     table
  3150.  
  3151. #define DEFINE_KSAUTOMATION_METHODS(table)\
  3152.     SIZEOF_ARRAY(table),\
  3153.     sizeof(KSMETHOD_ITEM),\
  3154.     table
  3155.  
  3156. #define DEFINE_KSAUTOMATION_EVENTS(table)\
  3157.     SIZEOF_ARRAY(table),\
  3158.     sizeof(KSEVENT_ITEM),\
  3159.     table
  3160.  
  3161. #define DEFINE_KSAUTOMATION_PROPERTIES_NULL\
  3162.     0,\
  3163.     sizeof(KSPROPERTY_ITEM),\
  3164.     NULL
  3165.  
  3166. #define DEFINE_KSAUTOMATION_METHODS_NULL\
  3167.     0,\
  3168.     sizeof(KSMETHOD_ITEM),\
  3169.     NULL
  3170.  
  3171. #define DEFINE_KSAUTOMATION_EVENTS_NULL\
  3172.     0,\
  3173.     sizeof(KSEVENT_ITEM),\
  3174.     NULL
  3175.  
  3176. #define MIN_DEV_VER_FOR_QI (0x100)
  3177.  
  3178. struct _KSDEVICE_DISPATCH {
  3179.     PFNKSDEVICECREATE Add;
  3180.     PFNKSDEVICEPNPSTART Start;
  3181.     PFNKSDEVICE PostStart;
  3182.     PFNKSDEVICEIRP QueryStop;
  3183.     PFNKSDEVICEIRPVOID CancelStop;
  3184.     PFNKSDEVICEIRPVOID Stop;
  3185.     PFNKSDEVICEIRP QueryRemove;
  3186.     PFNKSDEVICEIRPVOID CancelRemove;
  3187.     PFNKSDEVICEIRPVOID Remove;
  3188.     PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
  3189.     PFNKSDEVICEIRPVOID SurpriseRemoval;
  3190.     PFNKSDEVICEQUERYPOWER QueryPower;
  3191.     PFNKSDEVICESETPOWER SetPower;
  3192.     PFNKSDEVICEIRP QueryInterface;  // added in version 0x100
  3193. };
  3194.  
  3195. struct _KSFILTER_DISPATCH {
  3196.     PFNKSFILTERIRP Create;
  3197.     PFNKSFILTERIRP Close;
  3198.     PFNKSFILTERPROCESS Process;
  3199.     PFNKSFILTERVOID Reset;
  3200. };
  3201.  
  3202. struct _KSPIN_DISPATCH {
  3203.     PFNKSPINIRP Create;
  3204.     PFNKSPINIRP Close;
  3205.     PFNKSPIN Process;
  3206.     PFNKSPINVOID Reset;
  3207.     PFNKSPINSETDATAFORMAT SetDataFormat;
  3208.     PFNKSPINSETDEVICESTATE SetDeviceState;
  3209.     PFNKSPIN Connect;
  3210.     PFNKSPINVOID Disconnect;
  3211.     const KSCLOCK_DISPATCH* Clock;
  3212.     const KSALLOCATOR_DISPATCH* Allocator;
  3213. };
  3214.  
  3215. struct _KSCLOCK_DISPATCH {
  3216.     PFNKSPINSETTIMER SetTimer;
  3217.     PFNKSPINCANCELTIMER CancelTimer;
  3218.     PFNKSPINCORRELATEDTIME CorrelatedTime;
  3219.     PFNKSPINRESOLUTION Resolution;
  3220. };
  3221.  
  3222. struct _KSALLOCATOR_DISPATCH {
  3223.     PFNKSPININITIALIZEALLOCATOR InitializeAllocator;
  3224.     PFNKSDELETEALLOCATOR DeleteAllocator;
  3225.     PFNKSDEFAULTALLOCATE Allocate;
  3226.     PFNKSDEFAULTFREE Free;
  3227. };
  3228.  
  3229. #define KSDEVICE_DESCRIPTOR_VERSION (0x100)
  3230.  
  3231. struct _KSDEVICE_DESCRIPTOR {
  3232.     const KSDEVICE_DISPATCH* Dispatch;
  3233.     ULONG FilterDescriptorsCount;
  3234.     const KSFILTER_DESCRIPTOR*const* FilterDescriptors;
  3235.     ULONG Version; // this is 0 for pre-version 100 driver
  3236.     //#if !defined(_WIN64)
  3237.     //PVOID Alignment;
  3238.     //#endif //!defined(_WIN64)
  3239. };
  3240.  
  3241. struct _KSFILTER_DESCRIPTOR {
  3242.     const KSFILTER_DISPATCH* Dispatch;
  3243.     const KSAUTOMATION_TABLE* AutomationTable;
  3244.     ULONG Version;
  3245. #define KSFILTER_DESCRIPTOR_VERSION ((ULONG)-1)
  3246.     ULONG Flags;
  3247. #define KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING 0x00000001
  3248. #define KSFILTER_FLAG_CRITICAL_PROCESSING 0x00000002
  3249. #define KSFILTER_FLAG_HYPERCRITICAL_PROCESSING 0x00000004
  3250. #define KSFILTER_FLAG_RECEIVE_ZERO_LENGTH_SAMPLES 0x00000008
  3251. #define KSFILTER_FLAG_DENY_USERMODE_ACCESS 0x80000000
  3252.     const GUID* ReferenceGuid;
  3253.     ULONG PinDescriptorsCount;
  3254.     ULONG PinDescriptorSize;
  3255.     const KSPIN_DESCRIPTOR_EX* PinDescriptors;
  3256.     ULONG CategoriesCount;
  3257.     const GUID* Categories;
  3258.     ULONG NodeDescriptorsCount;
  3259.     ULONG NodeDescriptorSize;
  3260.     const KSNODE_DESCRIPTOR* NodeDescriptors;
  3261.     ULONG ConnectionsCount;
  3262.     const KSTOPOLOGY_CONNECTION* Connections;
  3263.     const KSCOMPONENTID* ComponentId;
  3264. };
  3265.  
  3266. #define DEFINE_KSFILTER_DESCRIPTOR(descriptor)\
  3267.     const KSFILTER_DESCRIPTOR descriptor =
  3268.  
  3269. #define DEFINE_KSFILTER_PIN_DESCRIPTORS(table)\
  3270.     SIZEOF_ARRAY(table),\
  3271.     sizeof(table[0]),\
  3272.     table
  3273.  
  3274. #define DEFINE_KSFILTER_CATEGORIES(table)\
  3275.     SIZEOF_ARRAY(table),\
  3276.     table
  3277.  
  3278. #define DEFINE_KSFILTER_CATEGORY(category)\
  3279.     1,\
  3280.     &(category)
  3281.  
  3282. #define DEFINE_KSFILTER_CATEGORIES_NULL\
  3283.     0,\
  3284.     NULL
  3285.  
  3286. #define DEFINE_KSFILTER_NODE_DESCRIPTORS(table)\
  3287.     SIZEOF_ARRAY(table),\
  3288.     sizeof(table[0]),\
  3289.     table
  3290.  
  3291. #define DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL\
  3292.     0,\
  3293.     sizeof(KSNODE_DESCRIPTOR),\
  3294.     NULL
  3295.  
  3296. #define DEFINE_KSFILTER_CONNECTIONS(table)\
  3297.     SIZEOF_ARRAY(table),\
  3298.     table
  3299.  
  3300. #define DEFINE_KSFILTER_DEFAULT_CONNECTIONS\
  3301.     0,\
  3302.     NULL
  3303.  
  3304. #define DEFINE_KSFILTER_DESCRIPTOR_TABLE(table)\
  3305.     const KSFILTER_DESCRIPTOR*const table[] =
  3306.  
  3307. struct _KSPIN_DESCRIPTOR_EX {
  3308.     const KSPIN_DISPATCH* Dispatch;
  3309.     const KSAUTOMATION_TABLE* AutomationTable;
  3310.     KSPIN_DESCRIPTOR PinDescriptor;
  3311.     ULONG Flags;
  3312. #define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING
  3313. #define KSPIN_FLAG_CRITICAL_PROCESSING KSFILTER_FLAG_CRITICAL_PROCESSING
  3314. #define KSPIN_FLAG_HYPERCRITICAL_PROCESSING KSFILTER_FLAG_HYPERCRITICAL_PROCESSING
  3315. #define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING 0x00000008
  3316. #define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING 0x00000010
  3317. #define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL 0x00000020
  3318. #define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING 0x00000040
  3319. #define KSPIN_FLAG_ENFORCE_FIFO 0x00000080
  3320.  
  3321. #define KSPIN_FLAG_GENERATE_MAPPINGS 0x00000100
  3322. #define KSPIN_FLAG_DISTINCT_TRAILING_EDGE 0x00000200
  3323.  
  3324. #define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY 0x00010000
  3325. #define KSPIN_FLAG_SPLITTER 0x00020000
  3326. #define KSPIN_FLAG_USE_STANDARD_TRANSPORT 0x00040000
  3327. #define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT 0x00080000
  3328. #define KSPIN_FLAG_FIXED_FORMAT 0x00100000
  3329. #define KSPIN_FLAG_GENERATE_EOS_EVENTS 0x00200000
  3330. #define KSPIN_FLAG_RENDERER (KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY|KSPIN_FLAG_GENERATE_EOS_EVENTS)
  3331. #define KSPIN_FLAG_IMPLEMENT_CLOCK 0x00400000
  3332. #define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING 0x00800000
  3333. #define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE 0x01000000
  3334. #define KSPIN_FLAG_DENY_USERMODE_ACCESS 0x80000000
  3335.     ULONG InstancesPossible;
  3336.     ULONG InstancesNecessary;
  3337.     const KSALLOCATOR_FRAMING_EX* AllocatorFraming;
  3338.     PFNKSINTERSECTHANDLEREX IntersectHandler;
  3339. };
  3340.  
  3341. #define DEFINE_KSPIN_DEFAULT_INTERFACES\
  3342.     0,\
  3343.     NULL
  3344.  
  3345. #define DEFINE_KSPIN_DEFAULT_MEDIUMS\
  3346.     0,\
  3347.     NULL
  3348.  
  3349. struct _KSNODE_DESCRIPTOR {
  3350.     const KSAUTOMATION_TABLE* AutomationTable;
  3351.     const GUID* Type;
  3352.     const GUID* Name;
  3353. #if !defined(_WIN64)
  3354.     PVOID Alignment;
  3355. #endif // !defined(_WIN64)
  3356. };
  3357.  
  3358. #if !defined(_WIN64)
  3359. #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  3360.     { (automation), (type), (name), NULL }
  3361. #else // !defined(_WIN64)
  3362. #define DEFINE_NODE_DESCRIPTOR(automation,type,name) \
  3363.     { (automation), (type), (name) }
  3364. #endif // !defined(_WIN64)
  3365.  
  3366. struct _KSDEVICE {
  3367.     const KSDEVICE_DESCRIPTOR* Descriptor;
  3368.     KSOBJECT_BAG Bag;
  3369.     PVOID Context;
  3370.     PDEVICE_OBJECT FunctionalDeviceObject;
  3371.     PDEVICE_OBJECT PhysicalDeviceObject;
  3372.     PDEVICE_OBJECT NextDeviceObject;
  3373.     BOOLEAN Started;
  3374.     SYSTEM_POWER_STATE SystemPowerState;
  3375.     DEVICE_POWER_STATE DevicePowerState;
  3376. };
  3377.  
  3378. struct _KSFILTERFACTORY {
  3379.     const KSFILTER_DESCRIPTOR* FilterDescriptor;
  3380.     KSOBJECT_BAG Bag;
  3381.     PVOID Context;
  3382. };
  3383.  
  3384. struct _KSFILTER {
  3385.     const KSFILTER_DESCRIPTOR* Descriptor;
  3386.     KSOBJECT_BAG Bag;
  3387.     PVOID Context;
  3388. };
  3389.  
  3390. struct _KSPIN {
  3391.     const KSPIN_DESCRIPTOR_EX* Descriptor;
  3392.     KSOBJECT_BAG Bag;
  3393.     PVOID Context;
  3394.     ULONG Id;
  3395.     KSPIN_COMMUNICATION Communication;
  3396.     BOOLEAN ConnectionIsExternal;
  3397.     KSPIN_INTERFACE ConnectionInterface;
  3398.     KSPIN_MEDIUM ConnectionMedium;
  3399.     KSPRIORITY ConnectionPriority;
  3400.     PKSDATAFORMAT ConnectionFormat;
  3401.     PKSMULTIPLE_ITEM AttributeList;
  3402.     ULONG StreamHeaderSize;
  3403.     KSPIN_DATAFLOW DataFlow;
  3404.     KSSTATE DeviceState;
  3405.     KSRESET ResetState;
  3406.     KSSTATE ClientState;
  3407. };
  3408.  
  3409. struct _KSMAPPING {
  3410.     PHYSICAL_ADDRESS PhysicalAddress;
  3411.     ULONG ByteCount;
  3412.     ULONG Alignment;
  3413. };
  3414.  
  3415. struct _KSSTREAM_POINTER_OFFSET
  3416. {
  3417. #if defined(_NTDDK_)
  3418.     union {
  3419.         PUCHAR Data;
  3420.         PKSMAPPING Mappings;
  3421.     };
  3422. #else // !defined(_NTDDK_)
  3423.     PUCHAR Data;
  3424. #endif // !defined(_NTDDK_)
  3425. #if !defined(_WIN64)
  3426.     PVOID Alignment;
  3427. #endif // !defined(_WIN64)
  3428.     ULONG Count;
  3429.     ULONG Remaining;
  3430. };
  3431.  
  3432. struct _KSSTREAM_POINTER
  3433. {
  3434.     PVOID Context;
  3435.     PKSPIN Pin;
  3436.     PKSSTREAM_HEADER StreamHeader;
  3437.     PKSSTREAM_POINTER_OFFSET Offset;
  3438.     KSSTREAM_POINTER_OFFSET OffsetIn;
  3439.     KSSTREAM_POINTER_OFFSET OffsetOut;
  3440. };
  3441.  
  3442. struct _KSPROCESSPIN {
  3443.     PKSPIN Pin;
  3444.     PKSSTREAM_POINTER StreamPointer;
  3445.     PKSPROCESSPIN InPlaceCounterpart;
  3446.     PKSPROCESSPIN DelegateBranch;
  3447.     PKSPROCESSPIN CopySource;
  3448.     PVOID Data;
  3449.     ULONG BytesAvailable;
  3450.     ULONG BytesUsed;
  3451.     ULONG Flags;
  3452.     BOOLEAN Terminate;
  3453. };
  3454.  
  3455. struct _KSPROCESSPIN_INDEXENTRY {
  3456.     PKSPROCESSPIN *Pins;
  3457.     ULONG Count;
  3458. };
  3459.  
  3460. typedef enum {
  3461.     KsObjectTypeDevice,
  3462.     KsObjectTypeFilterFactory,
  3463.     KsObjectTypeFilter,
  3464.     KsObjectTypePin
  3465. } KSOBJECTTYPE;
  3466.  
  3467. typedef
  3468. void
  3469. (*PFNKSFREE)(
  3470.     IN PVOID Data
  3471.     );
  3472.  
  3473. typedef
  3474. void
  3475. (*PFNKSPINFRAMERETURN)(
  3476.     IN PKSPIN Pin,
  3477.     IN PVOID Data OPTIONAL,
  3478.     IN ULONG Size OPTIONAL,
  3479.     IN PMDL Mdl OPTIONAL,
  3480.     IN PVOID Context OPTIONAL,
  3481.     IN NTSTATUS Status
  3482.     );
  3483.  
  3484. typedef
  3485. void
  3486. (*PFNKSPINIRPCOMPLETION)(
  3487.     IN PKSPIN Pin,
  3488.     IN PIRP Irp
  3489.     );
  3490.  
  3491. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  3492. #if !defined(_IKsControl_)
  3493. #define _IKsControl_
  3494.  
  3495. typedef interface IKsControl* PIKSCONTROL;
  3496.  
  3497. #if !defined(DEFINE_ABSTRACT_UNKNOWN)
  3498.  
  3499. #define DEFINE_ABSTRACT_UNKNOWN()                               \
  3500.     STDMETHOD_(NTSTATUS, QueryInterface)(THIS_                   \
  3501.         REFIID InterfaceId,                                     \
  3502.         PVOID* Interface                                        \
  3503.         ) PURE;                                                 \
  3504.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;                        \
  3505.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  3506.  
  3507. #endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
  3508.  
  3509. #undef INTERFACE
  3510. #define INTERFACE IKsControl
  3511. DECLARE_INTERFACE_(IKsControl,IUnknown)
  3512. {
  3513.     DEFINE_ABSTRACT_UNKNOWN() // For C
  3514.  
  3515.     STDMETHOD_(NTSTATUS, KsProperty)(THIS_
  3516.         IN PKSPROPERTY Property,
  3517.         IN ULONG PropertyLength,
  3518.         IN OUT PVOID PropertyData,
  3519.         IN ULONG DataLength,
  3520.         OUT ULONG* BytesReturned
  3521.         ) PURE;
  3522.     STDMETHOD_(NTSTATUS, KsMethod)(THIS_
  3523.         IN PKSMETHOD Method,
  3524.         IN ULONG MethodLength,
  3525.         IN OUT PVOID MethodData,
  3526.         IN ULONG DataLength,
  3527.         OUT ULONG* BytesReturned
  3528.         ) PURE;
  3529.     STDMETHOD_(NTSTATUS, KsEvent)(THIS_
  3530.         IN PKSEVENT Event OPTIONAL,
  3531.         IN ULONG EventLength,
  3532.         IN OUT PVOID EventData,
  3533.         IN ULONG DataLength,
  3534.         OUT ULONG* BytesReturned
  3535.         ) PURE;
  3536. };
  3537.  
  3538. typedef interface IKsReferenceClock* PIKSREFERENCECLOCK;
  3539.  
  3540. #undef INTERFACE
  3541. #define INTERFACE IKsReferenceClock
  3542. DECLARE_INTERFACE_(IKsReferenceClock,IUnknown)
  3543. {
  3544.     DEFINE_ABSTRACT_UNKNOWN() // For C
  3545.  
  3546.     STDMETHOD_(LONGLONG,GetTime)(THIS
  3547.         ) PURE;
  3548.     STDMETHOD_(LONGLONG,GetPhysicalTime)(THIS
  3549.         ) PURE;
  3550.     STDMETHOD_(LONGLONG,GetCorrelatedTime)(THIS_
  3551.         OUT PLONGLONG SystemTime
  3552.         ) PURE;
  3553.     STDMETHOD_(LONGLONG,GetCorrelatedPhysicalTime)(THIS_
  3554.         OUT PLONGLONG SystemTime
  3555.         ) PURE;
  3556.     STDMETHOD_(NTSTATUS, GetResolution)(THIS_
  3557.         OUT PKSRESOLUTION Resolution
  3558.         ) PURE;
  3559.     STDMETHOD_(NTSTATUS, GetState)(THIS_
  3560.         OUT PKSSTATE State
  3561.         ) PURE;
  3562. };
  3563. #undef INTERFACE
  3564.  
  3565. #define STATIC_IID_IKsControl \
  3566. 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
  3567. DEFINE_GUID(IID_IKsControl,
  3568. 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96);
  3569. #if defined(__cplusplus) && _MSC_VER >= 1100
  3570. struct __declspec(uuid("28F54685-06FD-11D2-B27A-00A0C9223196")) IKsControl;
  3571. #endif
  3572.  
  3573. #define STATIC_IID_IKsFastClock \
  3574. 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e
  3575. DEFINE_GUID(IID_IKsFastClock,
  3576. 0xc9902485, 0xc180, 0x11d2, 0x84, 0x73, 0xd4, 0x23, 0x94, 0x45, 0x9e, 0x5e);
  3577. #if defined(__cplusplus) && _MSC_VER >= 1100
  3578. struct __declspec(uuid("C9902485-C180-11d2-8473-D42394459E5E")) IKsFastClock;
  3579. #endif
  3580.  
  3581. #endif // !defined(_IKsControl_)
  3582. #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  3583.  
  3584. #endif // defined(_NTDDK_)
  3585.  
  3586. //===========================================================================
  3587.  
  3588. #if defined(__cplusplus)
  3589. extern "C" {
  3590. #endif // defined(__cplusplus)
  3591.  
  3592. //
  3593. // exported prototypes
  3594. //
  3595.  
  3596. #ifdef _KSDDK_
  3597. #define KSDDKAPI
  3598. #else // !_KSDDK_
  3599. #define KSDDKAPI DECLSPEC_IMPORT
  3600. #endif // _KSDDK_
  3601.  
  3602. #if defined(_NTDDK_)
  3603.  
  3604. KSDDKAPI
  3605. NTSTATUS
  3606. NTAPI
  3607. KsEnableEvent(
  3608.     IN PIRP Irp,
  3609.     IN ULONG EventSetsCount,
  3610.     IN const KSEVENT_SET* EventSet,
  3611.     IN OUT PLIST_ENTRY EventsList OPTIONAL,
  3612.     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  3613.     IN PVOID EventsLock OPTIONAL
  3614.     );
  3615.  
  3616. KSDDKAPI
  3617. NTSTATUS
  3618. NTAPI
  3619. KsEnableEventWithAllocator(
  3620.     IN PIRP Irp,
  3621.     IN ULONG EventSetsCount,
  3622.     IN const KSEVENT_SET* EventSet,
  3623.     IN OUT PLIST_ENTRY EventsList OPTIONAL,
  3624.     IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL,
  3625.     IN PVOID EventsLock OPTIONAL,
  3626.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3627.     IN ULONG EventItemSize OPTIONAL
  3628.     );
  3629.  
  3630. KSDDKAPI
  3631. NTSTATUS
  3632. NTAPI
  3633. KsDisableEvent(
  3634.     IN PIRP Irp,
  3635.     IN OUT PLIST_ENTRY EventsList,
  3636.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3637.     IN PVOID EventsLock
  3638.     );
  3639.  
  3640. KSDDKAPI
  3641. VOID
  3642. NTAPI
  3643. KsDiscardEvent(
  3644.     IN PKSEVENT_ENTRY EventEntry
  3645.     );
  3646.  
  3647. KSDDKAPI
  3648. VOID
  3649. NTAPI
  3650. KsFreeEventList(
  3651.     IN PFILE_OBJECT FileObject,
  3652.     IN OUT PLIST_ENTRY EventsList,
  3653.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3654.     IN PVOID EventsLock
  3655.     );
  3656.  
  3657. KSDDKAPI
  3658. NTSTATUS
  3659. NTAPI
  3660. KsGenerateEvent(
  3661.     IN PKSEVENT_ENTRY EventEntry
  3662.     );
  3663.  
  3664. KSDDKAPI
  3665. NTSTATUS
  3666. NTAPI
  3667. KsGenerateDataEvent(
  3668.     IN PKSEVENT_ENTRY EventEntry,
  3669.     IN ULONG DataSize,
  3670.     IN PVOID Data
  3671.     );
  3672.  
  3673. KSDDKAPI
  3674. VOID
  3675. NTAPI
  3676. KsGenerateEventList(
  3677.     IN GUID* Set OPTIONAL,
  3678.     IN ULONG EventId,
  3679.     IN PLIST_ENTRY EventsList,
  3680.     IN KSEVENTS_LOCKTYPE EventsFlags,
  3681.     IN PVOID EventsLock
  3682.     );
  3683.  
  3684. // property.c:
  3685.  
  3686. KSDDKAPI
  3687. NTSTATUS
  3688. NTAPI
  3689. KsPropertyHandler(
  3690.     IN PIRP Irp,
  3691.     IN ULONG PropertySetsCount,
  3692.     IN const KSPROPERTY_SET* PropertySet
  3693.     );
  3694.  
  3695. KSDDKAPI
  3696. NTSTATUS
  3697. NTAPI
  3698. KsPropertyHandlerWithAllocator(
  3699.     IN PIRP Irp,
  3700.     IN ULONG PropertySetsCount,
  3701.     IN const KSPROPERTY_SET* PropertySet,
  3702.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3703.     IN ULONG PropertyItemSize OPTIONAL
  3704.     );
  3705.  
  3706. KSDDKAPI
  3707. BOOLEAN
  3708. NTAPI
  3709. KsFastPropertyHandler(
  3710.     IN PFILE_OBJECT FileObject,
  3711.     IN PKSPROPERTY Property,
  3712.     IN ULONG PropertyLength,
  3713.     IN OUT PVOID Data,
  3714.     IN ULONG DataLength,
  3715.     OUT PIO_STATUS_BLOCK IoStatus,
  3716.     IN ULONG PropertySetsCount,
  3717.     IN const KSPROPERTY_SET* PropertySet
  3718.     );
  3719.  
  3720. // method.c:
  3721.  
  3722. KSDDKAPI
  3723. NTSTATUS
  3724. NTAPI
  3725. KsMethodHandler(
  3726.     IN PIRP Irp,
  3727.     IN ULONG MethodSetsCount,
  3728.     IN const KSMETHOD_SET* MethodSet
  3729.     );
  3730.  
  3731. KSDDKAPI
  3732. NTSTATUS
  3733. NTAPI
  3734. KsMethodHandlerWithAllocator(
  3735.     IN PIRP Irp,
  3736.     IN ULONG MethodSetsCount,
  3737.     IN const KSMETHOD_SET* MethodSet,
  3738.     IN PFNKSALLOCATOR Allocator OPTIONAL,
  3739.     IN ULONG MethodItemSize OPTIONAL
  3740.     );
  3741.  
  3742. KSDDKAPI
  3743. BOOLEAN
  3744. NTAPI
  3745. KsFastMethodHandler(
  3746.     IN PFILE_OBJECT FileObject,
  3747.     IN PKSMETHOD Method,
  3748.     IN ULONG MethodLength,
  3749.     IN OUT PVOID Data,
  3750.     IN ULONG DataLength,
  3751.     OUT PIO_STATUS_BLOCK IoStatus,
  3752.     IN ULONG MethodSetsCount,
  3753.     IN const KSMETHOD_SET* MethodSet
  3754.     );
  3755.  
  3756. // alloc.c:
  3757.  
  3758. KSDDKAPI
  3759. NTSTATUS
  3760. NTAPI
  3761. KsCreateDefaultAllocator(
  3762.     IN PIRP Irp
  3763.     );
  3764.  
  3765. KSDDKAPI
  3766. NTSTATUS
  3767. NTAPI
  3768. KsCreateDefaultAllocatorEx(
  3769.     IN PIRP Irp,
  3770.     IN PVOID InitializeContext OPTIONAL,
  3771.     IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL,
  3772.     IN PFNKSDEFAULTFREE DefaultFree OPTIONAL,
  3773.     IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL,
  3774.     IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL
  3775.     );
  3776.  
  3777. KSDDKAPI
  3778. NTSTATUS
  3779. NTAPI
  3780. KsCreateAllocator(
  3781.     IN HANDLE ConnectionHandle,
  3782.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  3783.     OUT PHANDLE AllocatorHandle
  3784.     );
  3785.  
  3786. KSDDKAPI
  3787. NTSTATUS
  3788. NTAPI
  3789. KsValidateAllocatorCreateRequest(
  3790.     IN PIRP Irp,
  3791.     OUT PKSALLOCATOR_FRAMING* AllocatorFraming
  3792.     );
  3793.  
  3794. KSDDKAPI
  3795. NTSTATUS
  3796. NTAPI
  3797. KsValidateAllocatorFramingEx(
  3798.     IN PKSALLOCATOR_FRAMING_EX Framing,
  3799.     IN ULONG BufferSize,
  3800.     IN const KSALLOCATOR_FRAMING_EX *PinFraming
  3801.     );
  3802.  
  3803. // clock.c:
  3804.  
  3805. KSDDKAPI
  3806. NTSTATUS
  3807. NTAPI
  3808. KsAllocateDefaultClock(
  3809.     OUT PKSDEFAULTCLOCK* DefaultClock
  3810.     );
  3811.  
  3812. KSDDKAPI
  3813. NTSTATUS
  3814. NTAPI
  3815. KsAllocateDefaultClockEx(
  3816.     OUT PKSDEFAULTCLOCK* DefaultClock,
  3817.     IN PVOID Context OPTIONAL,
  3818.     IN PFNKSSETTIMER SetTimer OPTIONAL,
  3819.     IN PFNKSCANCELTIMER CancelTimer OPTIONAL,
  3820.     IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL,
  3821.     IN const KSRESOLUTION* Resolution OPTIONAL,
  3822.     IN ULONG Flags
  3823.     );
  3824.  
  3825. KSDDKAPI
  3826. VOID
  3827. NTAPI
  3828. KsFreeDefaultClock(
  3829.     IN PKSDEFAULTCLOCK DefaultClock
  3830.     );
  3831.  
  3832. KSDDKAPI
  3833. NTSTATUS
  3834. NTAPI
  3835. KsCreateDefaultClock(
  3836.     IN PIRP Irp,
  3837.     IN PKSDEFAULTCLOCK DefaultClock
  3838.     );
  3839.  
  3840. KSDDKAPI
  3841. NTSTATUS
  3842. NTAPI
  3843. KsCreateClock(
  3844.     IN HANDLE ConnectionHandle,
  3845.     IN PKSCLOCK_CREATE ClockCreate,
  3846.     OUT PHANDLE ClockHandle
  3847.     );
  3848.  
  3849. KSDDKAPI
  3850. NTSTATUS
  3851. NTAPI
  3852. KsValidateClockCreateRequest(
  3853.     IN PIRP Irp,
  3854.     OUT PKSCLOCK_CREATE* ClockCreate
  3855.     );
  3856.  
  3857. KSDDKAPI
  3858. KSSTATE
  3859. NTAPI
  3860. KsGetDefaultClockState(
  3861.     IN PKSDEFAULTCLOCK DefaultClock
  3862.     );
  3863.  
  3864. KSDDKAPI
  3865. VOID
  3866. NTAPI
  3867. KsSetDefaultClockState(
  3868.     IN PKSDEFAULTCLOCK DefaultClock,
  3869.     IN KSSTATE State
  3870.     );
  3871.  
  3872. KSDDKAPI
  3873. LONGLONG
  3874. NTAPI
  3875. KsGetDefaultClockTime(
  3876.     IN PKSDEFAULTCLOCK DefaultClock
  3877.     );
  3878.  
  3879. KSDDKAPI
  3880. VOID
  3881. NTAPI
  3882. KsSetDefaultClockTime(
  3883.     IN PKSDEFAULTCLOCK DefaultClock,
  3884.     IN LONGLONG Time
  3885.     );
  3886.  
  3887. // connect.c:
  3888.  
  3889. KSDDKAPI
  3890. NTSTATUS
  3891. NTAPI
  3892. KsCreatePin(
  3893.     IN HANDLE FilterHandle,
  3894.     IN PKSPIN_CONNECT Connect,
  3895.     IN ACCESS_MASK DesiredAccess,
  3896.     OUT PHANDLE ConnectionHandle
  3897.     );
  3898.  
  3899. KSDDKAPI
  3900. NTSTATUS
  3901. NTAPI
  3902. KsValidateConnectRequest(
  3903.     IN PIRP Irp,
  3904.     IN ULONG DescriptorsCount,
  3905.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3906.     OUT PKSPIN_CONNECT* Connect
  3907.     );
  3908.  
  3909. KSDDKAPI
  3910. NTSTATUS
  3911. NTAPI
  3912. KsPinPropertyHandler(
  3913.     IN PIRP Irp,
  3914.     IN PKSPROPERTY Property,
  3915.     IN OUT PVOID Data,
  3916.     IN ULONG DescriptorsCount,
  3917.     IN const KSPIN_DESCRIPTOR* Descriptor
  3918.     );
  3919.  
  3920. KSDDKAPI
  3921. NTSTATUS
  3922. NTAPI
  3923. KsPinDataIntersection(
  3924.     IN PIRP Irp,
  3925.     IN PKSP_PIN Pin,
  3926.     OUT PVOID Data OPTIONAL,
  3927.     IN ULONG DescriptorsCount,
  3928.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3929.     IN PFNKSINTERSECTHANDLER IntersectHandler
  3930.     );
  3931.  
  3932. KSDDKAPI
  3933. NTSTATUS
  3934. NTAPI
  3935. KsPinDataIntersectionEx(
  3936.     IN PIRP Irp,
  3937.     IN PKSP_PIN Pin,
  3938.     OUT PVOID Data,
  3939.     IN ULONG DescriptorsCount,
  3940.     IN const KSPIN_DESCRIPTOR* Descriptor,
  3941.     IN ULONG DescriptorSize,
  3942.     IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
  3943.     IN PVOID HandlerContext OPTIONAL
  3944.     );
  3945.  
  3946. KSDDKAPI
  3947. NTSTATUS
  3948. NTAPI
  3949. KsHandleSizedListQuery(
  3950.     IN PIRP Irp,
  3951.     IN ULONG DataItemsCount,
  3952.     IN ULONG DataItemSize,
  3953.     IN const VOID* DataItems
  3954.     );
  3955.  
  3956. // image.c:
  3957.  
  3958. #if (!defined( MAKEINTRESOURCE )) 
  3959. #define MAKEINTRESOURCE( res ) ((ULONG_PTR) (USHORT) res)
  3960. #endif
  3961.  
  3962. #if (!defined( RT_STRING ))
  3963. #define RT_STRING           MAKEINTRESOURCE( 6 )
  3964. #define RT_RCDATA           MAKEINTRESOURCE( 10 ) 
  3965. #endif
  3966.  
  3967. KSDDKAPI
  3968. NTSTATUS
  3969. NTAPI
  3970. KsLoadResource(
  3971.     IN PVOID ImageBase,
  3972.     IN POOL_TYPE PoolType,
  3973.     IN ULONG_PTR ResourceName,
  3974.     IN ULONG ResourceType,
  3975.     OUT PVOID *Resource,
  3976.     OUT PULONG ResourceSize            
  3977.     );
  3978.     
  3979. KSDDKAPI
  3980. NTSTATUS
  3981. NTAPI
  3982. KsGetImageNameAndResourceId(
  3983.     IN HANDLE RegKey,
  3984.     OUT PUNICODE_STRING ImageName,                
  3985.     OUT PULONG_PTR ResourceId,
  3986.     OUT PULONG ValueType
  3987. );
  3988.  
  3989. KSDDKAPI
  3990. NTSTATUS
  3991. NTAPI
  3992. KsMapModuleName(
  3993.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  3994.     IN PUNICODE_STRING ModuleName,
  3995.     OUT PUNICODE_STRING ImageName,                
  3996.     OUT PULONG_PTR ResourceId,
  3997.     OUT PULONG ValueType
  3998.     );
  3999.     
  4000. // irp.c:
  4001.  
  4002. KSDDKAPI
  4003. NTSTATUS
  4004. NTAPI
  4005. KsReferenceBusObject(
  4006.     IN KSDEVICE_HEADER  Header
  4007.     );
  4008.  
  4009. KSDDKAPI
  4010. VOID
  4011. NTAPI
  4012. KsDereferenceBusObject(
  4013.     IN KSDEVICE_HEADER  Header
  4014.     );
  4015.  
  4016. KSDDKAPI
  4017. NTSTATUS
  4018. NTAPI
  4019. KsDispatchQuerySecurity(
  4020.     IN PDEVICE_OBJECT DeviceObject,
  4021.     IN PIRP Irp
  4022.     );
  4023.  
  4024. KSDDKAPI
  4025. NTSTATUS
  4026. NTAPI
  4027. KsDispatchSetSecurity(
  4028.     IN PDEVICE_OBJECT DeviceObject,
  4029.     IN PIRP Irp
  4030.     );
  4031.  
  4032. KSDDKAPI
  4033. NTSTATUS
  4034. NTAPI
  4035. KsDispatchSpecificProperty(
  4036.     IN PIRP Irp,
  4037.     IN PFNKSHANDLER Handler
  4038.     );
  4039.  
  4040. KSDDKAPI
  4041. NTSTATUS
  4042. NTAPI
  4043. KsDispatchSpecificMethod(
  4044.     IN PIRP Irp,
  4045.     IN PFNKSHANDLER Handler
  4046.     );
  4047.  
  4048. KSDDKAPI
  4049. NTSTATUS
  4050. NTAPI
  4051. KsReadFile(
  4052.     IN PFILE_OBJECT FileObject,
  4053.     IN PKEVENT Event OPTIONAL,
  4054.     IN PVOID PortContext OPTIONAL,
  4055.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4056.     OUT PVOID Buffer,
  4057.     IN ULONG Length,
  4058.     IN ULONG Key OPTIONAL,
  4059.     IN KPROCESSOR_MODE RequestorMode
  4060.     );
  4061.  
  4062. KSDDKAPI
  4063. NTSTATUS
  4064. NTAPI
  4065. KsWriteFile(
  4066.     IN PFILE_OBJECT FileObject,
  4067.     IN PKEVENT Event OPTIONAL,
  4068.     IN PVOID PortContext OPTIONAL,
  4069.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4070.     IN PVOID Buffer,
  4071.     IN ULONG Length,
  4072.     IN ULONG Key OPTIONAL,
  4073.     IN KPROCESSOR_MODE RequestorMode
  4074.     );
  4075.  
  4076. KSDDKAPI
  4077. NTSTATUS
  4078. NTAPI
  4079. KsQueryInformationFile(
  4080.     IN PFILE_OBJECT FileObject,
  4081.     OUT PVOID FileInformation,
  4082.     IN ULONG Length,
  4083.     IN FILE_INFORMATION_CLASS FileInformationClass
  4084.     );
  4085.  
  4086. KSDDKAPI
  4087. NTSTATUS
  4088. NTAPI
  4089. KsSetInformationFile(
  4090.     IN PFILE_OBJECT FileObject,
  4091.     IN PVOID FileInformation,
  4092.     IN ULONG Length,
  4093.     IN FILE_INFORMATION_CLASS FileInformationClass
  4094.     );
  4095.  
  4096. KSDDKAPI
  4097. NTSTATUS
  4098. NTAPI
  4099. KsStreamIo(
  4100.     IN PFILE_OBJECT FileObject,
  4101.     IN PKEVENT Event OPTIONAL,
  4102.     IN PVOID PortContext OPTIONAL,
  4103.     IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
  4104.     IN PVOID CompletionContext OPTIONAL,
  4105.     IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL,
  4106.     OUT PIO_STATUS_BLOCK IoStatusBlock,
  4107.     IN OUT PVOID StreamHeaders,
  4108.     IN ULONG Length,
  4109.     IN ULONG Flags,
  4110.     IN KPROCESSOR_MODE RequestorMode
  4111.     );
  4112.  
  4113. KSDDKAPI
  4114. NTSTATUS
  4115. NTAPI
  4116. KsProbeStreamIrp(
  4117.     IN OUT PIRP Irp,
  4118.     IN ULONG ProbeFlags,
  4119.     IN ULONG HeaderSize OPTIONAL
  4120.     );
  4121.  
  4122. KSDDKAPI
  4123. NTSTATUS
  4124. NTAPI
  4125. KsAllocateExtraData(
  4126.     IN OUT PIRP Irp,
  4127.     IN ULONG ExtraSize,
  4128.     OUT PVOID* ExtraBuffer
  4129.     );
  4130.  
  4131. KSDDKAPI
  4132. VOID
  4133. NTAPI
  4134. KsNullDriverUnload(
  4135.     IN PDRIVER_OBJECT DriverObject
  4136.     );
  4137.  
  4138. KSDDKAPI
  4139. NTSTATUS
  4140. NTAPI
  4141. KsSetMajorFunctionHandler(
  4142.     IN PDRIVER_OBJECT DriverObject,
  4143.     IN ULONG MajorFunction
  4144.     );
  4145.  
  4146. KSDDKAPI
  4147. NTSTATUS
  4148. NTAPI
  4149. KsDispatchInvalidDeviceRequest(
  4150.     IN PDEVICE_OBJECT DeviceObject,
  4151.     IN PIRP Irp
  4152.     );
  4153.  
  4154. KSDDKAPI
  4155. NTSTATUS
  4156. NTAPI
  4157. KsDefaultDeviceIoCompletion(
  4158.     IN PDEVICE_OBJECT DeviceObject,
  4159.     IN PIRP Irp
  4160.     );
  4161.  
  4162. KSDDKAPI
  4163. NTSTATUS
  4164. NTAPI
  4165. KsDispatchIrp(
  4166.     IN PDEVICE_OBJECT DeviceObject,
  4167.     IN PIRP Irp
  4168.     );
  4169.  
  4170. KSDDKAPI
  4171. BOOLEAN
  4172. NTAPI
  4173. KsDispatchFastIoDeviceControlFailure(
  4174.     IN PFILE_OBJECT FileObject,
  4175.     IN BOOLEAN Wait,
  4176.     IN PVOID InputBuffer OPTIONAL,
  4177.     IN ULONG InputBufferLength,
  4178.     OUT PVOID OutputBuffer OPTIONAL,
  4179.     IN ULONG OutputBufferLength,
  4180.     IN ULONG IoControlCode,
  4181.     OUT PIO_STATUS_BLOCK IoStatus,
  4182.     IN PDEVICE_OBJECT DeviceObject
  4183.     );
  4184.  
  4185. KSDDKAPI
  4186. BOOLEAN
  4187. NTAPI
  4188. KsDispatchFastReadFailure(
  4189.     IN PFILE_OBJECT FileObject,
  4190.     IN PLARGE_INTEGER FileOffset,
  4191.     IN ULONG Length,
  4192.     IN BOOLEAN Wait,
  4193.     IN ULONG LockKey,
  4194.     OUT PVOID Buffer,
  4195.     OUT PIO_STATUS_BLOCK IoStatus,
  4196.     IN PDEVICE_OBJECT DeviceObject
  4197.     );
  4198.  
  4199. #define KsDispatchFastWriteFailure KsDispatchFastReadFailure
  4200.  
  4201. KSDDKAPI
  4202. VOID
  4203. NTAPI
  4204. KsCancelRoutine(
  4205.     IN PDEVICE_OBJECT DeviceObject,
  4206.     IN PIRP Irp
  4207.     );
  4208.  
  4209. KSDDKAPI
  4210. VOID
  4211. NTAPI
  4212. KsCancelIo(   
  4213.     IN OUT PLIST_ENTRY  QueueHead,
  4214.     IN PKSPIN_LOCK SpinLock
  4215.     );
  4216.  
  4217. KSDDKAPI
  4218. VOID
  4219. NTAPI
  4220. KsReleaseIrpOnCancelableQueue(
  4221.     IN PIRP Irp,
  4222.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  4223.     );
  4224.  
  4225. KSDDKAPI
  4226. PIRP
  4227. NTAPI
  4228. KsRemoveIrpFromCancelableQueue(
  4229.     IN OUT PLIST_ENTRY QueueHead,
  4230.     IN PKSPIN_LOCK SpinLock,
  4231.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4232.     IN KSIRP_REMOVAL_OPERATION RemovalOperation
  4233.     );
  4234.  
  4235. KSDDKAPI
  4236. NTSTATUS
  4237. NTAPI
  4238. KsMoveIrpsOnCancelableQueue(
  4239.     IN OUT PLIST_ENTRY SourceList,
  4240.     IN PKSPIN_LOCK SourceLock,
  4241.     IN OUT PLIST_ENTRY DestinationList,
  4242.     IN PKSPIN_LOCK DestinationLock OPTIONAL,
  4243.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4244.     IN PFNKSIRPLISTCALLBACK ListCallback,
  4245.     IN PVOID Context
  4246.     );
  4247.  
  4248. KSDDKAPI
  4249. VOID
  4250. NTAPI
  4251. KsRemoveSpecificIrpFromCancelableQueue(
  4252.     IN PIRP Irp
  4253.     );
  4254.  
  4255. KSDDKAPI
  4256. VOID
  4257. NTAPI
  4258. KsAddIrpToCancelableQueue(
  4259.     IN OUT PLIST_ENTRY QueueHead,
  4260.     IN PKSPIN_LOCK SpinLock,
  4261.     IN PIRP Irp,
  4262.     IN KSLIST_ENTRY_LOCATION ListLocation,
  4263.     IN PDRIVER_CANCEL DriverCancel OPTIONAL
  4264.     );
  4265.  
  4266. // api.c:
  4267.  
  4268. KSDDKAPI
  4269. NTSTATUS
  4270. NTAPI
  4271. KsAcquireResetValue(
  4272.     IN PIRP Irp,
  4273.     OUT KSRESET* ResetValue
  4274.     );
  4275.  
  4276. KSDDKAPI
  4277. NTSTATUS
  4278. NTAPI
  4279. KsTopologyPropertyHandler(
  4280.     IN PIRP Irp,
  4281.     IN PKSPROPERTY Property,
  4282.     IN OUT PVOID Data,
  4283.     IN const KSTOPOLOGY* Topology
  4284.     );
  4285.  
  4286. KSDDKAPI
  4287. VOID
  4288. NTAPI
  4289. KsAcquireDeviceSecurityLock(
  4290.     IN KSDEVICE_HEADER Header,
  4291.     IN BOOLEAN Exclusive
  4292.     );
  4293.  
  4294. KSDDKAPI
  4295. VOID
  4296. NTAPI
  4297. KsReleaseDeviceSecurityLock(
  4298.     IN KSDEVICE_HEADER Header
  4299.     );
  4300.     
  4301. KSDDKAPI
  4302. NTSTATUS
  4303. NTAPI
  4304. KsDefaultDispatchPnp(
  4305.     IN PDEVICE_OBJECT DeviceObject,
  4306.     IN PIRP Irp
  4307.     );
  4308.  
  4309. KSDDKAPI
  4310. NTSTATUS
  4311. NTAPI
  4312. KsDefaultDispatchPower(
  4313.     IN PDEVICE_OBJECT DeviceObject,
  4314.     IN PIRP Irp
  4315.     );
  4316.     
  4317. KSDDKAPI
  4318. NTSTATUS
  4319. NTAPI
  4320. KsDefaultForwardIrp(
  4321.     IN PDEVICE_OBJECT DeviceObject,
  4322.     IN PIRP Irp
  4323.     );
  4324.  
  4325. KSDDKAPI
  4326. VOID
  4327. NTAPI
  4328. KsSetDevicePnpAndBaseObject(
  4329.     IN KSDEVICE_HEADER Header,
  4330.     IN PDEVICE_OBJECT PnpDeviceObject,
  4331.     IN PDEVICE_OBJECT BaseObject
  4332.     );
  4333.  
  4334. KSDDKAPI
  4335. PDEVICE_OBJECT
  4336. NTAPI
  4337. KsQueryDevicePnpObject(
  4338.     IN KSDEVICE_HEADER Header
  4339.     );
  4340.  
  4341. KSDDKAPI
  4342. ACCESS_MASK
  4343. NTAPI
  4344. KsQueryObjectAccessMask(
  4345.     IN KSOBJECT_HEADER Header
  4346.     );
  4347.  
  4348. KSDDKAPI
  4349. VOID
  4350. NTAPI
  4351. KsRecalculateStackDepth(
  4352.     IN KSDEVICE_HEADER Header,
  4353.     IN BOOLEAN ReuseStackLocation
  4354.     );
  4355.  
  4356. KSDDKAPI
  4357. VOID
  4358. NTAPI
  4359. KsSetTargetState(
  4360.     IN KSOBJECT_HEADER Header,
  4361.     IN KSTARGET_STATE TargetState
  4362.     );
  4363.  
  4364. KSDDKAPI
  4365. VOID
  4366. NTAPI
  4367. KsSetTargetDeviceObject(
  4368.     IN KSOBJECT_HEADER Header,
  4369.     IN PDEVICE_OBJECT TargetDevice OPTIONAL
  4370.     );
  4371.  
  4372. KSDDKAPI
  4373. VOID
  4374. NTAPI
  4375. KsSetPowerDispatch(
  4376.     IN KSOBJECT_HEADER Header,
  4377.     IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
  4378.     IN PVOID PowerContext OPTIONAL
  4379.     );
  4380.  
  4381. KSDDKAPI
  4382. PKSOBJECT_CREATE_ITEM
  4383. NTAPI
  4384. KsQueryObjectCreateItem(
  4385.     IN KSOBJECT_HEADER Header
  4386.     );
  4387.  
  4388. KSDDKAPI
  4389. NTSTATUS
  4390. NTAPI
  4391. KsAllocateDeviceHeader(
  4392.     OUT KSDEVICE_HEADER* Header,
  4393.     IN ULONG ItemsCount,
  4394.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
  4395.     );
  4396.  
  4397. KSDDKAPI
  4398. VOID
  4399. NTAPI
  4400. KsFreeDeviceHeader(
  4401.     IN KSDEVICE_HEADER Header
  4402.     );
  4403.  
  4404. KSDDKAPI
  4405. NTSTATUS
  4406. NTAPI
  4407. KsAllocateObjectHeader(
  4408.     OUT KSOBJECT_HEADER* Header,
  4409.     IN ULONG ItemsCount,
  4410.     IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
  4411.     IN PIRP Irp,
  4412.     IN const KSDISPATCH_TABLE* Table
  4413.     );
  4414.  
  4415. KSDDKAPI
  4416. VOID
  4417. NTAPI
  4418. KsFreeObjectHeader(
  4419.     IN KSOBJECT_HEADER Header
  4420.     );
  4421.  
  4422. KSDDKAPI
  4423. NTSTATUS
  4424. NTAPI
  4425. KsAddObjectCreateItemToDeviceHeader(
  4426.     IN KSDEVICE_HEADER Header,
  4427.     IN PDRIVER_DISPATCH Create,
  4428.     IN PVOID Context,
  4429.     IN PWCHAR ObjectClass,
  4430.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  4431.     );
  4432.  
  4433. KSDDKAPI
  4434. NTSTATUS
  4435. NTAPI
  4436. KsAddObjectCreateItemToObjectHeader(
  4437.     IN KSOBJECT_HEADER Header,
  4438.     IN PDRIVER_DISPATCH Create,
  4439.     IN PVOID Context,
  4440.     IN PWCHAR ObjectClass,
  4441.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL
  4442.     );
  4443.  
  4444. KSDDKAPI
  4445. NTSTATUS
  4446. NTAPI
  4447. KsAllocateObjectCreateItem(
  4448.     IN KSDEVICE_HEADER Header,
  4449.     IN PKSOBJECT_CREATE_ITEM CreateItem,
  4450.     IN BOOLEAN AllocateEntry,
  4451.     IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
  4452.     );
  4453.  
  4454. KSDDKAPI
  4455. NTSTATUS
  4456. NTAPI
  4457. KsFreeObjectCreateItem(
  4458.     IN KSDEVICE_HEADER Header,
  4459.     IN PUNICODE_STRING CreateItem
  4460.     );
  4461.  
  4462. KSDDKAPI
  4463. NTSTATUS
  4464. NTAPI
  4465. KsFreeObjectCreateItemsByContext(
  4466.     IN KSDEVICE_HEADER Header,
  4467.     IN PVOID Context
  4468.     );
  4469.  
  4470. KSDDKAPI
  4471. NTSTATUS
  4472. NTAPI
  4473. KsCreateDefaultSecurity(
  4474.     IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL,
  4475.     OUT PSECURITY_DESCRIPTOR* DefaultSecurity
  4476.     );
  4477.  
  4478. KSDDKAPI
  4479. NTSTATUS
  4480. NTAPI
  4481. KsForwardIrp(
  4482.     IN PIRP Irp,
  4483.     IN PFILE_OBJECT FileObject,
  4484.     IN BOOLEAN ReuseStackLocation
  4485.     );
  4486.  
  4487. KSDDKAPI
  4488. NTSTATUS
  4489. NTAPI
  4490. KsForwardAndCatchIrp(
  4491.     IN PDEVICE_OBJECT DeviceObject,
  4492.     IN PIRP Irp,
  4493.     IN PFILE_OBJECT FileObject,
  4494.     IN KSSTACK_USE StackUse
  4495.     );
  4496.  
  4497. KSDDKAPI
  4498. NTSTATUS
  4499. NTAPI
  4500. KsSynchronousIoControlDevice(
  4501.     IN PFILE_OBJECT FileObject,
  4502.     IN KPROCESSOR_MODE RequestorMode,
  4503.     IN ULONG IoControl,
  4504.     IN PVOID InBuffer,
  4505.     IN ULONG InSize,
  4506.     OUT PVOID OutBuffer,
  4507.     IN ULONG OutSize,
  4508.     OUT PULONG BytesReturned
  4509.     );
  4510.  
  4511. KSDDKAPI
  4512. NTSTATUS
  4513. NTAPI
  4514. KsUnserializeObjectPropertiesFromRegistry(
  4515.     IN PFILE_OBJECT FileObject,
  4516.     IN HANDLE ParentKey OPTIONAL,
  4517.     IN PUNICODE_STRING RegistryPath OPTIONAL
  4518.     );
  4519.  
  4520. KSDDKAPI
  4521. NTSTATUS
  4522. NTAPI
  4523. KsCacheMedium(
  4524.     IN PUNICODE_STRING SymbolicLink,
  4525.     IN PKSPIN_MEDIUM Medium,
  4526.     IN ULONG PinDirection
  4527.     );
  4528.  
  4529. // thread.c:
  4530.  
  4531. KSDDKAPI
  4532. NTSTATUS
  4533. NTAPI
  4534. KsRegisterWorker(
  4535.     IN WORK_QUEUE_TYPE WorkQueueType,
  4536.     OUT PKSWORKER* Worker
  4537.     );
  4538. KSDDKAPI
  4539. NTSTATUS
  4540. NTAPI
  4541. KsRegisterCountedWorker(
  4542.     IN WORK_QUEUE_TYPE WorkQueueType,
  4543.     IN PWORK_QUEUE_ITEM CountedWorkItem,
  4544.     OUT PKSWORKER* Worker
  4545.     );
  4546. KSDDKAPI
  4547. VOID
  4548. NTAPI
  4549. KsUnregisterWorker(
  4550.     IN PKSWORKER Worker
  4551.     );
  4552. KSDDKAPI
  4553. NTSTATUS
  4554. NTAPI
  4555. KsQueueWorkItem(
  4556.     IN PKSWORKER Worker,
  4557.     IN PWORK_QUEUE_ITEM WorkItem
  4558.     );
  4559. KSDDKAPI
  4560. ULONG
  4561. NTAPI
  4562. KsIncrementCountedWorker(
  4563.     IN PKSWORKER Worker
  4564.     );
  4565. KSDDKAPI
  4566. ULONG
  4567. NTAPI
  4568. KsDecrementCountedWorker(
  4569.     IN PKSWORKER Worker
  4570.     );
  4571.  
  4572. // topology.c:
  4573.  
  4574. KSDDKAPI
  4575. NTSTATUS
  4576. NTAPI
  4577. KsCreateTopologyNode(
  4578.     IN HANDLE ParentHandle,
  4579.     IN PKSNODE_CREATE NodeCreate,
  4580.     IN ACCESS_MASK DesiredAccess,
  4581.     OUT PHANDLE NodeHandle
  4582.     );
  4583.  
  4584. KSDDKAPI
  4585. NTSTATUS
  4586. NTAPI
  4587. KsValidateTopologyNodeCreateRequest(
  4588.     IN PIRP Irp,
  4589.     IN PKSTOPOLOGY Topology,
  4590.     OUT PKSNODE_CREATE* NodeCreate
  4591.     );
  4592.  
  4593. KSDDKAPI
  4594. NTSTATUS
  4595. NTAPI
  4596. KsMergeAutomationTables(
  4597.     OUT PKSAUTOMATION_TABLE* AutomationTableAB,
  4598.     IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL,
  4599.     IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL,
  4600.     IN KSOBJECT_BAG Bag OPTIONAL
  4601.     );
  4602.  
  4603. KSDDKAPI
  4604. NTSTATUS
  4605. NTAPI
  4606. KsInitializeDriver(
  4607.     IN PDRIVER_OBJECT DriverObject,
  4608.     IN PUNICODE_STRING RegistryPathName,
  4609.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  4610.     );
  4611.  
  4612. KSDDKAPI
  4613. NTSTATUS
  4614. NTAPI
  4615. KsAddDevice(
  4616.     IN PDRIVER_OBJECT DriverObject,
  4617.     IN PDEVICE_OBJECT PhysicalDeviceObject
  4618.     );
  4619.  
  4620. KSDDKAPI
  4621. NTSTATUS
  4622. NTAPI
  4623. KsCreateDevice(
  4624.     IN PDRIVER_OBJECT DriverObject,
  4625.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  4626.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
  4627.     IN ULONG ExtensionSize OPTIONAL,
  4628.     OUT PKSDEVICE* Device OPTIONAL
  4629.     );
  4630.  
  4631. KSDDKAPI
  4632. NTSTATUS
  4633. NTAPI
  4634. KsInitializeDevice(
  4635.     IN PDEVICE_OBJECT FunctionalDeviceObject,
  4636.     IN PDEVICE_OBJECT PhysicalDeviceObject,
  4637.     IN PDEVICE_OBJECT NextDeviceObject,
  4638.     IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL
  4639.     );
  4640.  
  4641. KSDDKAPI
  4642. void
  4643. NTAPI
  4644. KsTerminateDevice(
  4645.     IN PDEVICE_OBJECT DeviceObject
  4646.     );
  4647.  
  4648. KSDDKAPI
  4649. PKSDEVICE
  4650. NTAPI
  4651. KsGetDeviceForDeviceObject(
  4652.     IN PDEVICE_OBJECT FunctionalDeviceObject
  4653.     );
  4654.  
  4655. KSDDKAPI
  4656. void
  4657. NTAPI
  4658. KsAcquireDevice(
  4659.     IN PKSDEVICE Device
  4660.     );
  4661.  
  4662. KSDDKAPI
  4663. void
  4664. NTAPI
  4665. KsReleaseDevice(
  4666.     IN PKSDEVICE Device
  4667.     );
  4668.  
  4669. KSDDKAPI
  4670. void
  4671. NTAPI
  4672. KsDeviceRegisterAdapterObject(
  4673.     IN PKSDEVICE Device,
  4674.     IN PADAPTER_OBJECT AdapterObject,
  4675.     IN ULONG MaxMappingsByteCount,
  4676.     IN ULONG MappingTableStride
  4677.     );
  4678.  
  4679. KSDDKAPI
  4680. ULONG
  4681. NTAPI
  4682. KsDeviceGetBusData(
  4683.     IN PKSDEVICE Device,
  4684.     IN ULONG DataType,
  4685.     IN PVOID Buffer,
  4686.     IN ULONG Offset,
  4687.     IN ULONG Length
  4688.     );
  4689.  
  4690. KSDDKAPI
  4691. ULONG
  4692. NTAPI
  4693. KsDeviceSetBusData(
  4694.     IN PKSDEVICE Device,
  4695.     IN ULONG DataType,
  4696.     IN PVOID Buffer,
  4697.     IN ULONG Offset,
  4698.     IN ULONG Length
  4699.     );
  4700.  
  4701. KSDDKAPI
  4702. NTSTATUS
  4703. NTAPI
  4704. KsCreateFilterFactory(
  4705.     IN PDEVICE_OBJECT DeviceObject,
  4706.     IN const KSFILTER_DESCRIPTOR* Descriptor,
  4707.     IN PWCHAR RefString OPTIONAL,
  4708.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  4709.     IN ULONG CreateItemFlags,
  4710.     IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL,
  4711.     IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL,
  4712.     OUT PKSFILTERFACTORY* FilterFactory OPTIONAL
  4713.     );
  4714.  
  4715. #define KsDeleteFilterFactory(FilterFactory) \
  4716.     KsFreeObjectCreateItemsByContext(\
  4717.         *(KSDEVICE_HEADER *)(\
  4718.             KsFilterFactoryGetParentDevice(FilterFactory)->FunctionalDeviceObject->\
  4719.                 DeviceExtension),\
  4720.         FilterFactory)
  4721.  
  4722. KSDDKAPI
  4723. NTSTATUS
  4724. NTAPI
  4725. KsFilterFactoryUpdateCacheData(
  4726.     IN PKSFILTERFACTORY FilterFactory,
  4727.     IN const KSFILTER_DESCRIPTOR *FilterDescriptor OPTIONAL
  4728.     );
  4729.  
  4730. KSDDKAPI
  4731. NTSTATUS
  4732. NTAPI
  4733. KsFilterFactoryAddCreateItem(
  4734.     IN PKSFILTERFACTORY FilterFactory,
  4735.     IN PWCHAR RefString,
  4736.     IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
  4737.     IN ULONG CreateItemFlags
  4738.     );
  4739.  
  4740. KSDDKAPI
  4741. NTSTATUS
  4742. NTAPI
  4743. KsFilterFactorySetDeviceClassesState(
  4744.     IN PKSFILTERFACTORY FilterFactory,
  4745.     IN BOOLEAN NewState
  4746.     );
  4747.  
  4748. KSDDKAPI
  4749. PUNICODE_STRING
  4750. NTAPI
  4751. KsFilterFactoryGetSymbolicLink(
  4752.     IN PKSFILTERFACTORY FilterFactory
  4753.     );
  4754.  
  4755. KSDDKAPI
  4756. void
  4757. NTAPI
  4758. KsAddEvent(
  4759.     IN PVOID Object,
  4760.     IN PKSEVENT_ENTRY EventEntry
  4761.     );
  4762.  
  4763. void _inline
  4764. KsFilterAddEvent(
  4765.     IN PKSFILTER Filter,
  4766.     IN PKSEVENT_ENTRY EventEntry
  4767.     )
  4768. {
  4769.     KsAddEvent(Filter,EventEntry);
  4770. }
  4771.  
  4772. void _inline
  4773. KsPinAddEvent(
  4774.     IN PKSPIN Pin,
  4775.     IN PKSEVENT_ENTRY EventEntry
  4776.     )
  4777. {
  4778.     KsAddEvent(Pin,EventEntry);
  4779. }
  4780.  
  4781. KSDDKAPI
  4782. NTSTATUS    
  4783. NTAPI
  4784. KsDefaultAddEventHandler(
  4785.     IN PIRP Irp,
  4786.     IN PKSEVENTDATA EventData,
  4787.     IN OUT PKSEVENT_ENTRY EventEntry
  4788.     );
  4789.  
  4790. KSDDKAPI
  4791. void
  4792. NTAPI
  4793. KsGenerateEvents(
  4794.     IN PVOID Object,
  4795.     IN const GUID* EventSet OPTIONAL,
  4796.     IN ULONG EventId,
  4797.     IN ULONG DataSize,
  4798.     IN PVOID Data OPTIONAL,
  4799.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4800.     IN PVOID CallBackContext OPTIONAL
  4801.     );
  4802.  
  4803. void _inline
  4804. KsFilterGenerateEvents(
  4805.     IN PKSFILTER Filter,
  4806.     IN const GUID* EventSet OPTIONAL,
  4807.     IN ULONG EventId,
  4808.     IN ULONG DataSize,
  4809.     IN PVOID Data OPTIONAL,
  4810.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4811.     IN PVOID CallBackContext OPTIONAL
  4812.     )
  4813. {
  4814.     KsGenerateEvents(
  4815.         Filter,
  4816.         EventSet,
  4817.         EventId,
  4818.         DataSize,
  4819.         Data,
  4820.         CallBack,
  4821.         CallBackContext);
  4822. }
  4823.  
  4824. void _inline
  4825. KsPinGenerateEvents(
  4826.     IN PKSPIN Pin,
  4827.     IN const GUID* EventSet OPTIONAL,
  4828.     IN ULONG EventId,
  4829.     IN ULONG DataSize,
  4830.     IN PVOID Data OPTIONAL,
  4831.     IN PFNKSGENERATEEVENTCALLBACK CallBack OPTIONAL,
  4832.     IN PVOID CallBackContext OPTIONAL
  4833.     )
  4834. {
  4835.     KsGenerateEvents(
  4836.         Pin,
  4837.         EventSet,
  4838.         EventId,
  4839.         DataSize,
  4840.         Data,
  4841.         CallBack,
  4842.         CallBackContext);
  4843. }
  4844.  
  4845. typedef enum {
  4846.     KSSTREAM_POINTER_STATE_UNLOCKED = 0,
  4847.     KSSTREAM_POINTER_STATE_LOCKED
  4848. } KSSTREAM_POINTER_STATE;
  4849.  
  4850. KSDDKAPI
  4851. NTSTATUS
  4852. NTAPI
  4853. KsPinGetAvailableByteCount(
  4854.     IN PKSPIN Pin,
  4855.     OUT PLONG InputDataBytes OPTIONAL,
  4856.     OUT PLONG OutputBufferBytes OPTIONAL
  4857.     );
  4858.  
  4859. KSDDKAPI
  4860. PKSSTREAM_POINTER
  4861. NTAPI
  4862. KsPinGetLeadingEdgeStreamPointer(
  4863.     IN PKSPIN Pin,
  4864.     IN KSSTREAM_POINTER_STATE State
  4865.     );
  4866.  
  4867. KSDDKAPI
  4868. PKSSTREAM_POINTER
  4869. NTAPI
  4870. KsPinGetTrailingEdgeStreamPointer(
  4871.     IN PKSPIN Pin,
  4872.     IN KSSTREAM_POINTER_STATE State
  4873.     );
  4874.  
  4875. KSDDKAPI
  4876. NTSTATUS
  4877. NTAPI
  4878. KsStreamPointerSetStatusCode(
  4879.     IN PKSSTREAM_POINTER StreamPointer,
  4880.     IN NTSTATUS Status
  4881.     );
  4882.  
  4883. KSDDKAPI
  4884. NTSTATUS
  4885. NTAPI
  4886. KsStreamPointerLock(
  4887.     IN PKSSTREAM_POINTER StreamPointer
  4888.     );
  4889.  
  4890. KSDDKAPI
  4891. void
  4892. NTAPI
  4893. KsStreamPointerUnlock(
  4894.     IN PKSSTREAM_POINTER StreamPointer,
  4895.     IN BOOLEAN Eject
  4896.     );
  4897.  
  4898. KSDDKAPI
  4899. void
  4900. NTAPI
  4901. KsStreamPointerAdvanceOffsetsAndUnlock(
  4902.     IN PKSSTREAM_POINTER StreamPointer,
  4903.     IN ULONG InUsed,
  4904.     IN ULONG OutUsed,
  4905.     IN BOOLEAN Eject
  4906.     );
  4907.  
  4908. KSDDKAPI
  4909. void
  4910. NTAPI
  4911. KsStreamPointerDelete(
  4912.     IN PKSSTREAM_POINTER StreamPointer
  4913.     );
  4914.  
  4915. KSDDKAPI
  4916. NTSTATUS
  4917. NTAPI
  4918. KsStreamPointerClone(
  4919.     IN PKSSTREAM_POINTER StreamPointer,
  4920.     IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL,
  4921.     IN ULONG ContextSize,
  4922.     OUT PKSSTREAM_POINTER* CloneStreamPointer
  4923.     );
  4924.  
  4925. KSDDKAPI
  4926. NTSTATUS
  4927. NTAPI
  4928. KsStreamPointerAdvanceOffsets(
  4929.     IN PKSSTREAM_POINTER StreamPointer,
  4930.     IN ULONG InUsed,
  4931.     IN ULONG OutUsed,
  4932.     IN BOOLEAN Eject
  4933.     );
  4934.  
  4935. KSDDKAPI
  4936. NTSTATUS
  4937. NTAPI
  4938. KsStreamPointerAdvance(
  4939.     IN PKSSTREAM_POINTER StreamPointer
  4940.     );
  4941.  
  4942. KSDDKAPI
  4943. PMDL
  4944. NTAPI
  4945. KsStreamPointerGetMdl(
  4946.     IN PKSSTREAM_POINTER StreamPointer
  4947.     );
  4948.  
  4949. KSDDKAPI
  4950. PIRP
  4951. NTAPI
  4952. KsStreamPointerGetIrp(
  4953.     IN PKSSTREAM_POINTER StreamPointer,
  4954.     OUT PBOOLEAN FirstFrameInIrp OPTIONAL,
  4955.     OUT PBOOLEAN LastFrameInIrp OPTIONAL
  4956.     );
  4957.  
  4958. KSDDKAPI
  4959. void
  4960. NTAPI
  4961. KsStreamPointerScheduleTimeout(
  4962.     IN PKSSTREAM_POINTER StreamPointer,
  4963.     IN PFNKSSTREAMPOINTER Callback,
  4964.     IN ULONGLONG Interval
  4965.     );
  4966.  
  4967. KSDDKAPI
  4968. void
  4969. NTAPI
  4970. KsStreamPointerCancelTimeout(
  4971.     IN PKSSTREAM_POINTER StreamPointer
  4972.     );
  4973.  
  4974. KSDDKAPI
  4975. PKSSTREAM_POINTER
  4976. NTAPI
  4977. KsPinGetFirstCloneStreamPointer(
  4978.     IN PKSPIN Pin
  4979.     );
  4980.  
  4981. KSDDKAPI
  4982. PKSSTREAM_POINTER
  4983. NTAPI
  4984. KsStreamPointerGetNextClone(
  4985.     IN PKSSTREAM_POINTER StreamPointer
  4986.     );
  4987.  
  4988. KSDDKAPI
  4989. NTSTATUS
  4990. NTAPI
  4991. KsPinHandshake(
  4992.     IN PKSPIN Pin,
  4993.     IN PKSHANDSHAKE In,
  4994.     OUT PKSHANDSHAKE Out
  4995.     );
  4996.  
  4997. KSDDKAPI
  4998. void
  4999. NTAPI
  5000. KsCompletePendingRequest(
  5001.     IN PIRP Irp
  5002.     );
  5003.  
  5004. KSDDKAPI
  5005. KSOBJECTTYPE
  5006. NTAPI
  5007. KsGetObjectTypeFromIrp(
  5008.     IN PIRP Irp
  5009.     );
  5010.  
  5011. KSDDKAPI
  5012. PVOID
  5013. NTAPI
  5014. KsGetObjectFromFileObject(
  5015.     IN PFILE_OBJECT FileObject
  5016.     );
  5017.  
  5018. KSDDKAPI
  5019. KSOBJECTTYPE
  5020. NTAPI
  5021. KsGetObjectTypeFromFileObject(
  5022.     IN PFILE_OBJECT FileObject
  5023.     );
  5024.  
  5025. PKSFILTER __inline
  5026. KsGetFilterFromFileObject(
  5027.     IN PFILE_OBJECT FileObject
  5028.     )
  5029. {
  5030.     return (PKSFILTER) KsGetObjectFromFileObject(FileObject);
  5031. }
  5032.  
  5033. PKSPIN __inline
  5034. KsGetPinFromFileObject(
  5035.     IN PFILE_OBJECT FileObject
  5036.     )
  5037. {
  5038.     return (PKSPIN) KsGetObjectFromFileObject(FileObject);
  5039. }    
  5040.  
  5041. KSDDKAPI
  5042. PKSGATE
  5043. NTAPI
  5044. KsFilterGetAndGate(
  5045.     IN PKSFILTER Filter
  5046.     );
  5047.  
  5048. KSDDKAPI
  5049. void
  5050. NTAPI
  5051. KsFilterAcquireProcessingMutex(
  5052.     IN PKSFILTER Filter
  5053.     );
  5054.  
  5055. KSDDKAPI
  5056. void
  5057. NTAPI
  5058. KsFilterReleaseProcessingMutex(
  5059.     IN PKSFILTER Filter
  5060.     );
  5061.  
  5062. KSDDKAPI
  5063. void
  5064. NTAPI
  5065. KsFilterAttemptProcessing(
  5066.     IN PKSFILTER Filter,
  5067.     IN BOOLEAN Asynchronous
  5068.     );
  5069.  
  5070. KSDDKAPI
  5071. PKSGATE
  5072. NTAPI
  5073. KsPinGetAndGate(
  5074.     IN PKSPIN Pin
  5075.     );
  5076.  
  5077. KSDDKAPI
  5078. void
  5079. NTAPI
  5080. KsPinAttachAndGate(
  5081.     IN PKSPIN Pin,
  5082.     IN PKSGATE AndGate OPTIONAL
  5083.     );
  5084.  
  5085. KSDDKAPI
  5086. void
  5087. NTAPI
  5088. KsPinAttachOrGate(
  5089.     IN PKSPIN Pin,
  5090.     IN PKSGATE OrGate OPTIONAL
  5091.     );
  5092.  
  5093. KSDDKAPI
  5094. void
  5095. NTAPI
  5096. KsPinAcquireProcessingMutex(
  5097.     IN PKSPIN Pin
  5098.     );
  5099.  
  5100. KSDDKAPI
  5101. void
  5102. NTAPI
  5103. KsPinReleaseProcessingMutex(
  5104.     IN PKSPIN Pin
  5105.     );
  5106.  
  5107. KSDDKAPI
  5108. BOOLEAN
  5109. NTAPI
  5110. KsProcessPinUpdate(
  5111.     IN PKSPROCESSPIN ProcessPin
  5112.     );
  5113.  
  5114. KSDDKAPI
  5115. void
  5116. NTAPI
  5117. KsPinGetCopyRelationships(
  5118.     IN PKSPIN Pin,
  5119.     OUT PKSPIN* CopySource,
  5120.     OUT PKSPIN* DelegateBranch
  5121.     );
  5122.  
  5123. KSDDKAPI
  5124. void
  5125. NTAPI
  5126. KsPinAttemptProcessing(
  5127.     IN PKSPIN Pin,
  5128.     IN BOOLEAN Asynchronous
  5129.     );
  5130.  
  5131. KSDDKAPI
  5132. PVOID
  5133. NTAPI
  5134. KsGetParent(
  5135.     IN PVOID Object
  5136.     );
  5137.  
  5138. PKSDEVICE __inline
  5139. KsFilterFactoryGetParentDevice(
  5140.     IN PKSFILTERFACTORY FilterFactory
  5141.     )
  5142. {
  5143.     return (PKSDEVICE) KsGetParent((PVOID) FilterFactory);
  5144. }
  5145.  
  5146. PKSFILTERFACTORY __inline
  5147. KsFilterGetParentFilterFactory(
  5148.     IN PKSFILTER Filter
  5149.     )
  5150. {
  5151.     return (PKSFILTERFACTORY) KsGetParent((PVOID) Filter);
  5152. }
  5153.  
  5154. KSDDKAPI
  5155. PKSFILTER 
  5156. NTAPI
  5157. KsPinGetParentFilter(
  5158.     IN PKSPIN Pin
  5159.     );
  5160.  
  5161. KSDDKAPI
  5162. PVOID
  5163. NTAPI
  5164. KsGetFirstChild(
  5165.     IN PVOID Object
  5166.     );
  5167.  
  5168. PKSFILTERFACTORY __inline
  5169. KsDeviceGetFirstChildFilterFactory(
  5170.     IN PKSDEVICE Device
  5171.     )
  5172. {
  5173.     return (PKSFILTERFACTORY) KsGetFirstChild((PVOID) Device);
  5174. }
  5175.  
  5176. PKSFILTER __inline
  5177. KsFilterFactoryGetFirstChildFilter(
  5178.     IN PKSFILTERFACTORY FilterFactory
  5179.     )
  5180. {
  5181.     return (PKSFILTER) KsGetFirstChild((PVOID) FilterFactory);
  5182. }
  5183.  
  5184. KSDDKAPI
  5185. ULONG
  5186. NTAPI
  5187. KsFilterGetChildPinCount(
  5188.     IN PKSFILTER Filter,
  5189.     IN ULONG PinId
  5190.     );
  5191.  
  5192. KSDDKAPI
  5193. PKSPIN
  5194. NTAPI
  5195. KsFilterGetFirstChildPin(
  5196.     IN PKSFILTER Filter,
  5197.     IN ULONG PinId
  5198.     );
  5199.  
  5200. KSDDKAPI
  5201. PVOID
  5202. NTAPI
  5203. KsGetNextSibling(
  5204.     IN PVOID Object
  5205.     );
  5206.  
  5207. KSDDKAPI
  5208. PKSPIN 
  5209. NTAPI
  5210. KsPinGetNextSiblingPin(
  5211.     IN PKSPIN Pin
  5212.     );
  5213.  
  5214. PKSFILTERFACTORY __inline
  5215. KsFilterFactoryGetNextSiblingFilterFactory(
  5216.     IN PKSFILTERFACTORY FilterFactory
  5217.     )
  5218. {
  5219.     return (PKSFILTERFACTORY) KsGetNextSibling((PVOID) FilterFactory);
  5220. }
  5221.  
  5222. PKSFILTER __inline
  5223. KsFilterGetNextSiblingFilter(
  5224.     IN PKSFILTER Filter
  5225.     )
  5226. {
  5227.     return (PKSFILTER) KsGetNextSibling((PVOID) Filter);
  5228. }
  5229.  
  5230.  
  5231. KSDDKAPI
  5232. PKSDEVICE
  5233. NTAPI
  5234. KsGetDevice(
  5235.     IN PVOID Object
  5236.     );
  5237.  
  5238. PKSDEVICE __inline
  5239. KsFilterFactoryGetDevice(
  5240.     IN PKSFILTERFACTORY FilterFactory
  5241.     )
  5242. {
  5243.     return KsGetDevice((PVOID) FilterFactory);
  5244. }
  5245.  
  5246. PKSDEVICE __inline
  5247. KsFilterGetDevice(
  5248.     IN PKSFILTER Filter
  5249.     )
  5250. {
  5251.     return KsGetDevice((PVOID) Filter);
  5252. }
  5253.  
  5254. PKSDEVICE __inline
  5255. KsPinGetDevice(
  5256.     IN PKSPIN Pin
  5257.     )
  5258. {
  5259.     return KsGetDevice((PVOID) Pin);
  5260. }
  5261.  
  5262. KSDDKAPI
  5263. PKSFILTER
  5264. NTAPI
  5265. KsGetFilterFromIrp(
  5266.     IN PIRP Irp
  5267.     );
  5268.  
  5269. KSDDKAPI
  5270. PKSPIN
  5271. NTAPI
  5272. KsGetPinFromIrp(
  5273.     IN PIRP Irp
  5274.     );
  5275.  
  5276. KSDDKAPI
  5277. ULONG
  5278. NTAPI
  5279. KsGetNodeIdFromIrp(
  5280.     IN PIRP Irp
  5281.     );
  5282.  
  5283. KSDDKAPI
  5284. void
  5285. NTAPI
  5286. KsAcquireControl(
  5287.     IN PVOID Object
  5288.     );
  5289.  
  5290. KSDDKAPI
  5291. void
  5292. NTAPI
  5293. KsReleaseControl(
  5294.     IN PVOID Object
  5295.     );
  5296.  
  5297. void __inline
  5298. KsFilterAcquireControl(
  5299.     IN PKSFILTER Filter
  5300.     )
  5301. {
  5302.     KsAcquireControl((PVOID) Filter);
  5303. }
  5304.  
  5305. void __inline
  5306. KsFilterReleaseControl(
  5307.     IN PKSFILTER Filter
  5308.     )
  5309. {
  5310.     KsReleaseControl((PVOID) Filter);
  5311. }
  5312.  
  5313. void __inline
  5314. KsPinAcquireControl(
  5315.     IN PKSPIN Pin
  5316.     )
  5317. {
  5318.     KsAcquireControl((PVOID) Pin);
  5319. }
  5320.  
  5321. void __inline
  5322. KsPinReleaseControl(
  5323.     IN PKSPIN Pin
  5324.     )
  5325. {
  5326.     KsReleaseControl((PVOID) Pin);
  5327. }
  5328.  
  5329. KSDDKAPI
  5330. NTSTATUS
  5331. NTAPI
  5332. KsAddItemToObjectBag(
  5333.     IN KSOBJECT_BAG ObjectBag,
  5334.     IN PVOID Item,
  5335.     IN PFNKSFREE Free OPTIONAL
  5336.     );
  5337.  
  5338. KSDDKAPI
  5339. ULONG
  5340. NTAPI
  5341. KsRemoveItemFromObjectBag(
  5342.     IN KSOBJECT_BAG ObjectBag,
  5343.     IN PVOID Item,
  5344.     IN BOOLEAN Free
  5345.     );
  5346.  
  5347. #define KsDiscard(Object,Pointer)\
  5348.     KsRemoveItemFromObjectBag(\
  5349.         (Object)->Bag,\
  5350.         (PVOID)(Pointer),\
  5351.         TRUE)
  5352.  
  5353. KSDDKAPI
  5354. NTSTATUS
  5355. NTAPI
  5356. KsAllocateObjectBag(
  5357.     IN PKSDEVICE Device,
  5358.     OUT KSOBJECT_BAG* ObjectBag
  5359.     );
  5360.  
  5361. KSDDKAPI
  5362. void
  5363. NTAPI
  5364. KsFreeObjectBag(
  5365.     IN KSOBJECT_BAG ObjectBag
  5366.     );
  5367.  
  5368. KSDDKAPI
  5369. NTSTATUS
  5370. NTAPI
  5371. KsCopyObjectBagItems(
  5372.     IN KSOBJECT_BAG ObjectBagDestination,
  5373.     IN KSOBJECT_BAG ObjectBagSource
  5374.     );
  5375.  
  5376. KSDDKAPI
  5377. NTSTATUS
  5378. NTAPI
  5379. _KsEdit(
  5380.     IN KSOBJECT_BAG ObjectBag,
  5381.     IN OUT PVOID* PointerToPointerToItem,
  5382.     IN ULONG NewSize,
  5383.     IN ULONG OldSize,
  5384.     IN ULONG Tag
  5385.     );
  5386.  
  5387. #define KsEdit(Object,PointerToPointer,Tag)\
  5388.     _KsEdit(\
  5389.         (Object)->Bag,\
  5390.         (PVOID*)(PointerToPointer),\
  5391.         sizeof(**(PointerToPointer)),\
  5392.         sizeof(**(PointerToPointer)),\
  5393.         (Tag))
  5394. #define KsEditSized(Object,PointerToPointer,NewSize,OldSize,Tag)\
  5395.     _KsEdit((Object)->Bag,(PVOID*)(PointerToPointer),(NewSize),(OldSize),(Tag))
  5396.  
  5397. KSDDKAPI
  5398. NTSTATUS
  5399. NTAPI
  5400. KsRegisterFilterWithNoKSPins(
  5401.                                       IN PDEVICE_OBJECT DeviceObject,
  5402.                                       IN const GUID * InterfaceClassGUID,
  5403.                                       IN ULONG PinCount,
  5404.                                       IN BOOL * PinDirection,
  5405.                                       IN KSPIN_MEDIUM * MediumList,
  5406.                                       IN OPTIONAL GUID * CategoryList
  5407. );
  5408.  
  5409. KSDDKAPI
  5410. NTSTATUS
  5411. NTAPI
  5412. KsFilterCreatePinFactory (
  5413.     IN PKSFILTER Filter,
  5414.     IN const KSPIN_DESCRIPTOR_EX *const PinDescriptor,
  5415.     OUT PULONG PinID
  5416.     );
  5417.  
  5418. KSDDKAPI
  5419. NTSTATUS
  5420. NTAPI
  5421. KsFilterCreateNode (
  5422.     IN PKSFILTER Filter,
  5423.     IN const KSNODE_DESCRIPTOR *const NodeDescriptor,
  5424.     OUT PULONG NodeID
  5425.     );
  5426.  
  5427. KSDDKAPI
  5428. NTSTATUS
  5429. NTAPI
  5430. KsFilterAddTopologyConnections (
  5431.     IN PKSFILTER Filter,
  5432.     IN ULONG NewConnectionsCount,
  5433.     IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections
  5434.     );
  5435.  
  5436. KSDDKAPI
  5437. NTSTATUS
  5438. NTAPI
  5439. KsPinGetConnectedPinInterface(
  5440.     IN PKSPIN Pin,
  5441.     IN const GUID* InterfaceId,
  5442.     OUT PVOID* Interface
  5443.     );
  5444.  
  5445. KSDDKAPI
  5446. PFILE_OBJECT
  5447. NTAPI
  5448. KsPinGetConnectedPinFileObject(
  5449.     IN PKSPIN Pin
  5450.     );
  5451.  
  5452. KSDDKAPI
  5453. PDEVICE_OBJECT
  5454. NTAPI
  5455. KsPinGetConnectedPinDeviceObject(
  5456.     IN PKSPIN Pin
  5457.     );
  5458.  
  5459. KSDDKAPI
  5460. NTSTATUS
  5461. NTAPI
  5462. KsPinGetConnectedFilterInterface(
  5463.     IN PKSPIN Pin,
  5464.     IN const GUID* InterfaceId,
  5465.     OUT PVOID* Interface
  5466.     );
  5467.  
  5468. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5469.  
  5470. KSDDKAPI
  5471. NTSTATUS
  5472. NTAPI
  5473. KsPinGetReferenceClockInterface(
  5474.     IN PKSPIN Pin,
  5475.     OUT PIKSREFERENCECLOCK* Interface
  5476.     );
  5477.  
  5478. #endif //defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5479.  
  5480. KSDDKAPI
  5481. VOID
  5482. NTAPI
  5483. KsPinSetPinClockTime(
  5484.     IN PKSPIN Pin,
  5485.     IN LONGLONG Time
  5486.     );
  5487.  
  5488. KSDDKAPI
  5489. NTSTATUS
  5490. NTAPI
  5491. KsPinSubmitFrame(
  5492.     IN PKSPIN Pin,
  5493.     IN PVOID Data OPTIONAL,
  5494.     IN ULONG Size OPTIONAL,
  5495.     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  5496.     IN PVOID Context OPTIONAL
  5497.     );
  5498.  
  5499. KSDDKAPI
  5500. NTSTATUS
  5501. NTAPI
  5502. KsPinSubmitFrameMdl(
  5503.     IN PKSPIN Pin,
  5504.     IN PMDL Mdl OPTIONAL,
  5505.     IN PKSSTREAM_HEADER StreamHeader OPTIONAL,
  5506.     IN PVOID Context OPTIONAL
  5507.     );
  5508.  
  5509. KSDDKAPI
  5510. void
  5511. NTAPI
  5512. KsPinRegisterFrameReturnCallback(
  5513.     IN PKSPIN Pin,
  5514.     IN PFNKSPINFRAMERETURN FrameReturn
  5515.     );
  5516.  
  5517. KSDDKAPI
  5518. void
  5519. NTAPI
  5520. KsPinRegisterIrpCompletionCallback(
  5521.     IN PKSPIN Pin,
  5522.     IN PFNKSPINIRPCOMPLETION IrpCompletion
  5523.     );
  5524.  
  5525. KSDDKAPI
  5526. void
  5527. NTAPI
  5528. KsPinRegisterHandshakeCallback(
  5529.     IN PKSPIN Pin,
  5530.     IN PFNKSPINHANDSHAKE Handshake
  5531.     );
  5532.  
  5533. KSDDKAPI
  5534. void
  5535. NTAPI
  5536. KsFilterRegisterPowerCallbacks(
  5537.     IN PKSFILTER Filter,
  5538.     IN PFNKSFILTERPOWER Sleep OPTIONAL,
  5539.     IN PFNKSFILTERPOWER Wake OPTIONAL
  5540.     );
  5541.  
  5542. KSDDKAPI
  5543. void
  5544. NTAPI
  5545. KsPinRegisterPowerCallbacks(
  5546.     IN PKSPIN Pin,
  5547.     IN PFNKSPINPOWER Sleep OPTIONAL,
  5548.     IN PFNKSPINPOWER Wake OPTIONAL
  5549.     );
  5550.  
  5551. #if defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5552.  
  5553. KSDDKAPI
  5554. PUNKNOWN
  5555. NTAPI
  5556. KsRegisterAggregatedClientUnknown(
  5557.     IN PVOID Object,
  5558.     IN PUNKNOWN ClientUnknown 
  5559.     );
  5560.  
  5561. KSDDKAPI
  5562. PUNKNOWN
  5563. NTAPI
  5564. KsGetOuterUnknown(
  5565.     IN PVOID Object
  5566.     );
  5567.  
  5568. PUNKNOWN __inline
  5569. KsDeviceRegisterAggregatedClientUnknown(
  5570.     IN PKSDEVICE Device,
  5571.     IN PUNKNOWN ClientUnknown 
  5572.     )
  5573. {
  5574.     return KsRegisterAggregatedClientUnknown((PVOID) Device,ClientUnknown);
  5575. }
  5576.  
  5577. PUNKNOWN __inline
  5578. KsDeviceGetOuterUnknown(
  5579.     IN PKSDEVICE Device
  5580.     )
  5581. {
  5582.     return KsGetOuterUnknown((PVOID) Device);
  5583. }
  5584.  
  5585. PUNKNOWN __inline
  5586. KsFilterFactoryRegisterAggregatedClientUnknown(
  5587.     IN PKSFILTERFACTORY FilterFactory,
  5588.     IN PUNKNOWN ClientUnknown 
  5589.     )
  5590. {
  5591.     return KsRegisterAggregatedClientUnknown((PVOID) FilterFactory,ClientUnknown);
  5592. }
  5593.  
  5594. PUNKNOWN __inline
  5595. KsFilterFactoryGetOuterUnknown(
  5596.     IN PKSFILTERFACTORY FilterFactory
  5597.     )
  5598. {
  5599.     return KsGetOuterUnknown((PVOID) FilterFactory);
  5600. }
  5601.  
  5602. PUNKNOWN __inline
  5603. KsFilterRegisterAggregatedClientUnknown(
  5604.     IN PKSFILTER Filter,
  5605.     IN PUNKNOWN ClientUnknown 
  5606.     )
  5607. {
  5608.     return KsRegisterAggregatedClientUnknown((PVOID) Filter,ClientUnknown);
  5609. }
  5610.  
  5611. PUNKNOWN __inline
  5612. KsFilterGetOuterUnknown(
  5613.     IN PKSFILTER Filter
  5614.     )
  5615. {
  5616.     return KsGetOuterUnknown((PVOID) Filter);
  5617. }
  5618.  
  5619. PUNKNOWN __inline
  5620. KsPinRegisterAggregatedClientUnknown(
  5621.     IN PKSPIN Pin,
  5622.     IN PUNKNOWN ClientUnknown 
  5623.     )
  5624. {
  5625.     return KsRegisterAggregatedClientUnknown((PVOID) Pin,ClientUnknown);
  5626. }
  5627.  
  5628. PUNKNOWN __inline
  5629. KsPinGetOuterUnknown(
  5630.     IN PKSPIN Pin
  5631.     )
  5632. {
  5633.     return KsGetOuterUnknown((PVOID) Pin);
  5634. }
  5635.  
  5636. #endif // defined(_UNKNOWN_H_) || defined(__IUnknown_INTERFACE_DEFINED__)
  5637.  
  5638. #else // !defined(_NTDDK_)
  5639.  
  5640. #if !defined( KS_NO_CREATE_FUNCTIONS )
  5641.  
  5642. KSDDKAPI
  5643. DWORD
  5644. WINAPI
  5645. KsCreateAllocator(
  5646.     IN HANDLE ConnectionHandle,
  5647.     IN PKSALLOCATOR_FRAMING AllocatorFraming,
  5648.     OUT PHANDLE AllocatorHandle
  5649.     );
  5650.  
  5651. KSDDKAPI
  5652. DWORD
  5653. NTAPI
  5654. KsCreateClock(
  5655.     IN HANDLE ConnectionHandle,
  5656.     IN PKSCLOCK_CREATE ClockCreate,
  5657.     OUT PHANDLE ClockHandle
  5658.     );
  5659.  
  5660. KSDDKAPI
  5661. DWORD
  5662. WINAPI
  5663. KsCreatePin(
  5664.     IN HANDLE FilterHandle,
  5665.     IN PKSPIN_CONNECT Connect,
  5666.     IN ACCESS_MASK DesiredAccess,
  5667.     OUT PHANDLE ConnectionHandle
  5668.     );
  5669.  
  5670. KSDDKAPI
  5671. DWORD
  5672. WINAPI
  5673. KsCreateTopologyNode(
  5674.     IN HANDLE ParentHandle,
  5675.     IN PKSNODE_CREATE NodeCreate,
  5676.     IN ACCESS_MASK DesiredAccess,
  5677.     OUT PHANDLE NodeHandle
  5678.     );
  5679.     
  5680. #endif
  5681.  
  5682. #endif // !defined(_NTDDK_)
  5683.  
  5684. #if defined(__cplusplus)
  5685. }
  5686. #endif // defined(__cplusplus)
  5687.  
  5688.  
  5689. #define DENY_USERMODE_ACCESS( pIrp, CompleteRequest ) \
  5690. if ( pIrp->RequestorMode != KernelMode ) { \
  5691.     pIrp->IoStatus.Information = 0; \
  5692.     pIrp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; \
  5693.     if ( CompleteRequest ) IoCompleteRequest ( pIrp, IO_NO_INCREMENT ); \
  5694.     return STATUS_INVALID_DEVICE_REQUEST; \
  5695. }
  5696.  
  5697.  
  5698. #endif // !_KS_
  5699.